国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a"
对应 ".-"
, "b"
对应 "-..."
, "c"
对应 "-.-."
, 等等。
为了方便,所有26个英文字母对应摩尔斯密码表如下:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-.-....-",(即 "-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。
返回我们可以获得所有词不同单词翻译的数量。
例如: 输入: words = ["gin", "zen", "gig", "msg"] 输出: 2 解释: 各单词翻译如下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 种不同翻译, "--...-." 和 "--...--.".
注意:
- 单词列表
words
的长度不会超过100
。 - 每个单词
words[i]
的长度范围为[1, 12]
。 - 每个单词
words[i]
只包含小写字母。
代码:
class Solution {
public int uniqueMorseRepresentations(String[] words) {
String[] numberstr= new String[]{".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}; //所有26个英文字母对应摩尔斯密码表组成数组
Map<Integer,String> morsemap= new HashMap<Integer,String>();//创建morsemap的hashmap
Map<String,String> resultmap=new HashMap<String,String>();////创建resultmap的hashmap
preparenum(numberstr,morsemap);//将每个字母和对应的莫尔斯码进行存储
for(int i = 0;i<words.length;i++){
String morse= words[i];
String result="";
for(int j=0;j<morse.length();j++){
int str=morse.charAt(j);
String strs=morsemap.get(str);
result+=strs;
}
if(resultmap.isEmpty()){
resultmap.put(morse,result);
}
else{
if(!resultmap.containsValue(result)){
resultmap.put(morse,result);
}
}
}
return resultmap.size();
}
private static void preparenum(String[] numberstr,Map<Integer,String>morsemap){
for(int i=0;i<numberstr.length;i++){
morsemap.put(i+97,numberstr[i]);
}
}
}
测试用例及代码:
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
String[] words ={"gin", "zen", "gig", "msg"};
System.out.println(uniqueMorseRepresentations(words));
}
public static int uniqueMorseRepresentations(String[] words) {
String[] numberstr= new String[]{".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}; //所有26个英文字母对应摩尔斯密码表组成数组
Map<Integer,String> morsemap= new HashMap<Integer,String>();//创建morsemap的hashmap
Map<String,String> resultmap=new HashMap<String,String>();////创建resultmap的hashmap
preparenum(numberstr,morsemap);//将每个字母和对应的莫尔斯码进行存储
for(int i = 0;i<words.length;i++){
String morse= words[i];//先取出一个单词,例如"gin"
String result="";
for(int j=0;j<morse.length();j++){
int str=morse.charAt(j);//返回指定索引处的 char 值。索引范围为从 0 到 length() - 1,此处int,故返回一个数字
String strs=morsemap.get(str);//morsemap.get(),从mosremap中取出对应的strs
result+=strs;//字符串加在一起
}
if(resultmap.isEmpty()){
resultmap.put(morse,result);
}
else{
if(!resultmap.containsValue(result)){
resultmap.put(morse,result);//key=morse;value=result,key可以是字符串
//把结果的用resultmap的hashmap形式保存
}
}
}
return resultmap.size();
}
private static void preparenum(String[] numberstr,Map<Integer,String>morsemap){
for(int i=0;i<numberstr.length;i++){
morsemap.put(i+97,numberstr[i]);//morsemap<k,v>键与值对应
}
}
}