国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如:
'a'
对应".-"
,'b'
对应"-..."
,'c'
对应"-.-."
,以此类推。为了方便,所有
26
个英文字母的摩尔斯密码表如下:[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
给你一个字符串数组
words
,每个单词可以写成每个字母对应摩尔斯密码的组合。
- 例如,
"cab"
可以写成"-.-..--..."
,(即"-.-."
+".-"
+"-..."
字符串的结合)。我们将这样一个连接过程称作 单词翻译 。对
words
中所有单词进行单词翻译,返回不同 单词翻译 的数量。示例 1:
输入: words = ["gin", "zen", "gig", "msg"] 输出: 2 解释: 各单词翻译如下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 种不同翻译, "--...-." 和 "--...--.".
示例 2:
输入:words = ["a"] 输出:1
提示:
1 <= words.length <= 100
1 <= words[i].length <= 12
words[i]
由小写英文字母组成
哦吼,今天是个简单题,还是个通过率在80%以上的简单题,我觉得我又行了。
让我看看,哦,摩尔斯码啊,简单,这不就直接字母转换成点和线,然后再利用集合去重不就行了吗。
直接代码奉上!
class Solution:
def uniqueMorseRepresentations(self, words: List[str]) -> int:
# 题目中的摩尔斯码和字母的对照表先复制一下
morseLs = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
#装摩尔斯码的列表
repreLs = []
for word in words:
# 当前待拼接的摩尔斯码
curRepre = ""
for letter in word:
# 逐个字母进行转换
curRepre += morseLs[ord(letter)-97]
# 加入列表中
repreLs.append(curRepre)
#返回集合操作之后的序列长度
return len(set(repreLs))
提交,过了!
用时32ms,击败了93%的python用户,芜湖~
虽然不明白为什么运行一个测试用例要用56ms, 提交82个用例却只要32ms,离谱。
好了,然后照样来看看官方的解法。
官方解法说了用哈希表,虽然我不太熟悉哈希表,但这里面内核是一样的,只不过官方写得更加简洁,python的方法里的操作代码甚至浓缩成了一行!
Morse = [...] #省略内容
return len(set("".join(Morse[ord(ch)-ord('a')] for ch in word) for word in words))
当然这里还是要把Java的代码表达给学习一遍,毕竟今天的周赛题目做不出来的主要原因是代码表达水平跟不上理解水平。
class Solution {
// 抄写摩尔斯码表
public static final String[] MORSE = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
public int uniqueMorseRepresentations(String[] words) {
// 哈希集合类对象
Set<String> seen = new HashSet<String>();
for (String word:words){
//用StringBuilder可变长字符串类定义当前单词的摩尔斯码
StringBuilder cur = new StringBuilder();
for (int i=0;i<word.length();i++){
//注意字符串的索引要用.charAt()函数
char c = word.charAt(i);
//拼接字母对应的莫斯码,这里需要重点理解c-'a',Java里的字符本质上还是对应ASCII码内的数字,所以将两个字符相减时,相当于是将其对应的ASCII码相减,所以Java里不需要ord()函数
cur.append(MORSE[c-'a']);
}
//哈希集合中加入每个转换完毕的cur,注意这里StringBuilder类不能直接加入seen中,需要先用.toString()方法转换成String类
seen.add(cur.toString());
}
//返回哈希集合seen的长度
return seen.size();
}
}
简单题的价值在于不断加深对一些基本类及其基本操作的理解,所以即使做出来了,对其中用的一些常用类的方法还是需要仔细琢磨,慢慢品味。