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.
For convenience, the full table for the 26 letters of the English alphabet is given below:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
Now, given a list of words, each word can be written as a concatenation of the Morse code of each letter. For example, "cab" can be written as "-.-.-....-", (which is the concatenation "-.-." + "-..." + ".-"). We'll call such a concatenation, the transformation of a word.
Return the number of different transformations among all words we have.
Example: Input: words = ["gin", "zen", "gig", "msg"] Output: 2 Explanation: The transformation of each word is: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." There are 2 different transformations, "--...-." and "--...--.".
Note:
words
will be at most 100
.words[i]
will have length in range [1, 12]
.words[i]
will only consist of lowercase letters.class Solution {
public int uniqueMorseRepresentations(String[] words) {
String[] alpha = new String[] {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> newlist = new ArrayList<String>();
if(words.length == 0)
return 0;
for(int i = 0; i < words.length; i++){
String temp = "";
for(int len = 0; len < words[i].length(); len++){
temp += alpha[words[i].charAt(len) - 'a'];
}
list.add(temp);
}
newlist.add(list.get(0));
for(int i = 1; i < list.size(); i++){
if(newlist.contains(list.get(i)))
continue;
else{
newlist.add(list.get(i));
}
}
return newlist.size();
}
}
Intuition and Algorithm
We can transform each word
into it's Morse Code representation.
After, we put all transformations into a set seen
, and return the size of the set.
class Solution {
public int uniqueMorseRepresentations(String[] words) {
String[] MORSE = new String[]{".-","-...","-.-.","-..",".","..-.","--.",
"....","..",".---","-.-",".-..","--","-.",
"---",".--.","--.-",".-.","...","-","..-",
"...-",".--","-..-","-.--","--.."};
Set<String> seen = new HashSet();
for (String word: words) {
StringBuilder code = new StringBuilder();
for (char c: word.toCharArray())
code.append(MORSE[c - 'a']);
seen.add(code.toString());
}
return seen.size();
}
}
Complexity Analysis
Time Complexity: O(S), where S is the sum of the lengths of words in words
. We iterate through each character of each word in words
.
Space Complexity: O(S)
编程萌新。
我的思路是先把每个词换成morse码存进一个数组,然后另建一个数组,把不重复的morse码存入,最后输出新数组的大小,即为题中所求不同morse码的数量。这里还遇到一个坑,如果没有输入时要输出0。
看了Approach #1觉得其实大致思路差不多,但使用了HashSet,重复的元素就不会存入集合中,不需要另建一个新数组。还应学习的是StringBuilder的用法,还有for each的循环结构。