微信改版,加星标不迷路!
每日一算法-唯一摩尔斯密码词
作者:阿广
阅读目录
1 题目
2 解析
1 题目
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a"
对应 ".-"
, "b"
对应 "-..."
, "c"
对应 "-.-."
, 等等。
为了方便,所有26个英文字母对应摩尔斯密码表如下:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。
返回我们可以获得所有词不同单词翻译的数量。
例如:
输入: words = ["gin", "zen", "gig", "msg"]
输出: 2
解释: 各单词翻译如下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 种不同翻译, "--...-." 和 "--...--.".
2 解析
首先依次将words中的单词转换为摩尔斯密码,然后将转换后的结果存储到set集合中,最后返回set的大小。
注意:set集合具有唯一性。
例如set<string> s;
s.insert("aguang");
s.insert("azan");
s.insert("aguang");
printf("%d",s.size());
结果为:2,而不是3。
2.1依次将words中的单词转换为摩尔斯密码,利用swap函数解决,核心是switch语句。
string swap(string str)
{
string tem="";
char ch;
for(int i=0;i<str.length();i++)
{
ch=str[i];
switch(ch)
{
case 'a':
tem += ".-";
break;
case 'b':
tem += "-...";
break;
case 'c':
tem += "-.-.";
break;
case 'd':
tem += "-..";
break;
case 'e':
tem += ".";
break;
case 'f':
tem += "..-.";
break;
case 'g':
tem += "--.";
break;
case 'h':
tem += "....";
break;
case 'i':
tem += "..";
break;
case 'j':
tem += ".---";
break;
case 'k':
tem += "-.-" ;
break;
case 'l':
tem += ".-..";
break;
case 'm':
tem += "--" ;
break;
case 'n':
tem += "-.";
break;
case 'o':
tem += "---";
break;
case 'p':
tem += ".--.";
break;
case 'q':
tem += "--.-";
break;
case 'r':
tem += ".-.";
break;
case 's':
tem += "...";
break;
case 't':
tem += "-";
break;
case 'u':
tem += "..-";
break;
case 'v':
tem += "...-";
break;
case 'w':
tem += ".--";
break;
case 'x':
tem += "-..-";
break;
case 'y':
tem += "-.--";
break;
case 'z':
tem += "--..";
break;
default:
break;
}
}
return tem;
}
2.2将转换后的结果存储到set集合中,最后返回set的大小。
if(words.size()==0)
return 0;
set<string> se;
vector<string>::iterator iter = words.begin();
while(iter<words.end()){
se.insert(swap(*iter));
iter++;
}
return se.size();
2.3结果
3 完整代码
class Solution {
public:
int uniqueMorseRepresentations(vector<string>& words) {
if(words.size()==0)
return 0;
set<string> se;
vector<string>::iterator iter = words.begin();
while(iter<words.end())
{
se.insert(swap(*iter));
iter++;
}
return se.size();
}
string swap(string str)
{
string tem="";
char ch;
for(int i=0;i<str.length();i++)
{
ch=str[i];
switch(ch)
{
case 'a':
tem += ".-";
break;
case 'b':
tem += "-...";
break;
case 'c':
tem += "-.-.";
break;
case 'd':
tem += "-..";
break;
case 'e':
tem += ".";
break;
case 'f':
tem += "..-.";
break;
case 'g':
tem += "--.";
break;
case 'h':
tem += "....";
break;
case 'i':
tem += "..";
break;
case 'j':
tem += ".---";
break;
case 'k':
tem += "-.-" ;
break;
case 'l':
tem += ".-..";
break;
case 'm':
tem += "--" ;
break;
case 'n':
tem += "-.";
break;
case 'o':
tem += "---";
break;
case 'p':
tem += ".--.";
break;
case 'q':
tem += "--.-";
break;
case 'r':
tem += ".-.";
break;
case 's':
tem += "...";
break;
case 't':
tem += "-";
break;
case 'u':
tem += "..-";
break;
case 'v':
tem += "...-";
break;
case 'w':
tem += ".--";
break;
case 'x':
tem += "-..-";
break;
case 'y':
tem += "-.--";
break;
case 'z':
tem += "--..";
break;
default:
break;
}
}
return tem;
}
};
今日问题
你最常用的表情是什么?
打卡格式:打卡第n天,答:...