【每日一算法】唯一摩尔斯密码词

微信改版,加星标不迷路!

640?wx_fmt=png

每日一算法-唯一摩尔斯密码词

作者:阿广


阅读目录

  • 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结果

640?wx_fmt=png


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;
   }
};


640?

今日问题  

640?

你最常用的表情是什么?


打卡格式:打卡第n天,答:...


为什么打卡?戳下面你就知道了!



21/天/养/一/个/好/习/惯


640?wx_fmt=png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值