- Published on
ARTS 第29周
- Authors
- Name
- Jason Yang
- @yangjinlong86
Algorithm: 804. Unique Morse Code Words
Algorithm
package org.nocoder.leetcode.solution;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* 804. Unique Morse Code Words
* International Morse Code defines a standard encoding where each letter is mapped to a series of dots and dashes, as follows: "a" maps to ".-", "b" maps to "-...", "c" maps to "-.-.", and so on.
* <p>
* For convenience, the full table for the 26 letters of the English alphabet is given below:
* <p>
* [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
* Now, given a list of words, each word can be written as a concatenation of the Morse code of each letter. For example, "cba" can be written as "-.-..--...", (which is the concatenation "-.-." + "-..." + ".-"). We'll call such a concatenation, the transformation of a word.
* <p>
* Return the number of different transformations among all words we have.
* <p>
* Example:
* Input: words = ["gin", "zen", "gig", "msg"]
* Output: 2
* Explanation:
* The transformation of each word is:
* "gin" -> "--...-."
* "zen" -> "--...-."
* "gig" -> "--...--."
* "msg" -> "--...--."
* <p>
* There are 2 different transformations, "--...-." and "--...--.".
* Note:
* <p>
* The length of words will be at most 100.
* Each words[i] will have length in range [1, 12].
* words[i] will only consist of lowercase letters.
*
* @author jason
* @date 2019/1/21.
*/
public class UniqueMorseCodeWords {
private Map<String, String> initData() {
String[] morseCodes = new String[]{
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-",
".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
HashMap<String, String> map = new HashMap<>(26);
// ASCII a
int letter = 97;
for (int i = 0; i < morseCodes.length; i++) {
map.put(String.valueOf((char) letter++), morseCodes[i]);
}
return map;
}
public int uniqueMorseRepresentations(String[] words) {
final int MAX_LENGTH = 100;
if (words == null || words.length == 0 || words.length > MAX_LENGTH) {
return 0;
}
Map<String, String> map = initData();
Set<String> resultSet = new HashSet<>();
for (int i = 0; i < words.length; i++) {
String word = words[i];
StringBuilder morseCodes = new StringBuilder();
for (int j = 0; j < word.length(); j++) {
morseCodes.append(map.get(String.valueOf(word.charAt(j))));
}
resultSet.add(morseCodes.toString());
}
return resultSet.size();
}
public static void main(String[] args) {
UniqueMorseCodeWords uniqueMorseCodeWords = new UniqueMorseCodeWords();
uniqueMorseCodeWords.initData();
String[] words = new String[]{"gin", "zen", "gig", "msg"};
uniqueMorseCodeWords.uniqueMorseRepresentations(words);
}
}