摩尔斯电码定义了一种标准编码,把每个字母映射到一系列点和短划线,例如:a
-> .-
,b
-> -...
,c
->-.-.
。
给出26个字母的完整编码表格:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
现在给定一个单词列表,每个单词中每个字母可以写成摩尔斯编码。 例如,cab
可以写成-.-.-....-
,(把c
,a
,b
的莫尔斯编码串接起来)。 我们称之为一个词的转换。
返回所有单词中不同变换的数量。
样例
样例1:
输入: words = ["gin", "zen", "gig", "msg"]
输出: 2
解释:
每一个单词的变换是:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."
这里有两种不同的变换结果: "--...-."和"--...--.".
样例2:
输入: words = ["a", "b"]
输出: 2
解释:
每一个单词的变换是:
"a" -> ".-"
"b" -> "-..."
这里有两种不同的变换结果:".-" and "-...".
注意事项
- The length of
words
will be at most100
. - Each
words[i]
will have length in range[1, 12]
. words[i]
will only consist of lowercase letters.
解题思路:
使用数组将字符映射到对应的莫尔斯电码上,使用一个空的字符串连接起来,将最终生成的字符串插入到字符串的set里面,最后返回set的大小即可。简单来说就是映射去重。
public class Solution {
/**
* @param words: the given list of words
* @return: the number of different transformations among all words we have
*/
public int uniqueMorseRepresentations(String[] words) {
// Write your code here
String[] strs = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
Set<String> set = new HashSet<>();
for(String str : words){
StringBuilder sb = new StringBuilder();
for(char c : str.toCharArray())
sb.append(strs[c-'a']);
set.add(sb.toString());
}
return set.size();
}
}