问题描述
分析
本题的字母都为小写字母组成,要求是要我们返回不同翻译的数量,所以自然而然就想到了使用HashSet。将26的字母对应的莫尔斯电码存储到数组中,然后遍历输入的单词数组依次找出每个单词的每个字母。根据ASCLL码计算出其对应的莫尔斯电码在数组中的下标,将每个单词的各个字母对应的莫尔斯电码拼接在一起就是每个单词的莫尔斯电了。然后将各个单词对应的莫尔斯电码添加到HashSet中,因为HashSet是不能包含重复元素的,所以我们直接返回HashSet的size()就行,非常的方便。
代码实现
package org.kk.java.april;
import java.util.HashSet;
/**
* <p>
* 唯一摩尔斯密码词
* </P>
*
* @author Kk
* @since 2022/4/10 9:48
*/
public class Q804 {
public static void main(String[] args) {
System.out.println(uniqueMorseRepresentations(new String[]{"gin", "zen", "gig", "msg"}));
}
public static int uniqueMorseRepresentations(String[] words) {
String[] morse = new String[]{".-","-...","-.-.","-..",".","..-.",
"--.","....","..",".---","-.-",".-..","--","-.","---",".--.",
"--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
HashSet<String> morseCode = new HashSet<>();
StringBuilder temp = new StringBuilder();
for (String word : words) { //遍历出每个单词
for (int j = 0; j < word.length(); j++) { //遍历出每个单词的每个字母
char single = word.charAt(j);
//morse[single - 'a']是拿当前字母的ASCLL码减去‘a’的ASCLL码,就是对应字母在morse数组中的下标
temp.append(morse[single - 'a']); //将其添加到临时的StringBuilder中
}
morseCode.add(temp.toString());
//因为StringBuilder是定义在for循环外面的,不会每次循环new一个新的对象
temp.delete(0, temp.length()); //因此这里需要每添加完一个单词的摩斯电码之后将其清空,否则会重复添加
}
return morseCode.size();
}
}
对应输出结果
--...-.
--...-.
--...--.
--...--.
2