标题:唯一摩尔斯密码词
2 级
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串,按照如下规则:
为了方便,所有 26 \texttt{26} 26 个英语字母对应摩尔斯密码表如下:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
给定一个字符串数组 words \texttt{words} words,数组中的每个单词可以写成每个字母对应摩尔斯密码的组合。
返回我们可以获得所有不同单词翻译的数量。
示例 1:
输入:
words
=
["gin","zen","gig","msg"]
\texttt{words = ["gin","zen","gig","msg"]}
words = ["gin","zen","gig","msg"]
输出:
2
\texttt{2}
2
解释:各单词翻译如下:
"gin"
→
"--...-."
\texttt{"gin"} \rightarrow \texttt{"--...-."}
"gin"→"--...-."
"zen"
→
"--...-."
\texttt{"zen"} \rightarrow \texttt{"--...-."}
"zen"→"--...-."
"gig"
→
"--...--."
\texttt{"gig"} \rightarrow \texttt{"--...--."}
"gig"→"--...--."
"msg"
→
"--...--."
\texttt{"msg"} \rightarrow \texttt{"--...--."}
"msg"→"--...--."
共有
2
\texttt{2}
2 种不同翻译:
"--...-."
\texttt{"--...-."}
"--...-." 和
"--...--."
\texttt{"--...--."}
"--...--."。
示例 2:
输入:
words
=
["a"]
\texttt{words = ["a"]}
words = ["a"]
输出:
1
\texttt{1}
1
为了得到不同单词翻译的数量,需要将数组 words \textit{words} words 中的所有单词使用摩尔斯密码翻译,记录所有的单词翻译,去除重复项之后统计不同单词翻译的数量。
创建数组存储全部英语字母对应摩尔斯密码表,然后对于每个单词,遍历单词中的每个字母,得到每个字母对应的摩尔斯密码,连接之后即可得到单词翻译。
为了去除重复的单词翻译,使用哈希集合存储每个单词的单词翻译,哈希集合中的任意两个单词翻译都是不同的。遍历全部单词之后,哈希集合内的元素个数即为不同单词翻译的数量。
class Solution {
public int uniqueMorseRepresentations(String[] words) {
String[] morseArray = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
Set<String> set = new HashSet<String>();
for (String word : words) {
StringBuffer sb = new StringBuffer();
int length = word.length();
for (int i = 0; i < length; i++) {
char c = word.charAt(i);
sb.append(morseArray[c - 'a']);
}
set.add(sb.toString());
}
return set.size();
}
}
时间复杂度: O ( ∑ l w + ∑ l m ) O(\sum l_w + \sum l_m) O(∑lw+∑lm),即数组 words \textit{words} words 中所有单词的长度之和与所有单词对应的单词翻译的长度之和。需要 O ( ∑ l w ) O(\sum l_w) O(∑lw) 的时间遍历所有单词,对于每个单词,生成单词翻译和存入哈希表的时间为该单词对应的单词翻译的长度,因此对所有单词生成单词翻译和存入哈希表的时间为 O ( ∑ l m ) O(\sum l_m) O(∑lm)。总时间复杂度为 O ( ∑ l w + ∑ l m ) O(\sum l_w + \sum l_m) O(∑lw+∑lm)。
空间复杂度: O ( ∑ l m ) O(\sum l_m) O(∑lm),即数组 words \textit{words} words 中所有单词对应的单词翻译的长度之和。需要使用哈希表存储每个单词对应的单词翻译,最坏情况下,每个单词对应的单词翻译都不同,此时哈希表的空间为所有单词对应的单词翻译的长度之和。