目录
1. 题目描述
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如:
'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]
由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-morse-code-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题分析
本题的意思是说摩尔斯编码所得到的编码结果不是唯一的,这倒是以前不知道的。
简单直接的实现就是针对每个word,基于其中各字符从码字表中查找对应的码字,串接起来得到编码结果,然后数不同的编码结果。
在Python中,用函数ord()可以得到对应字符的ASCII码,比如说ord('a')=97, ord('b')=98,...,因此可以用ord(x)-ord('a)作为索引对codes进行查找。
然后,将各单词的编码结果存入集合,利用set()的唯一性的特征自动地将相同的编码结果合并为一项(可以理解为去重repetition removal处理)。最后返回所得的集合的大小即可。
3. 代码实现
class Solution:
def uniqueMorseRepresentations(self, words: List[str]) -> int:
codes = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
# d = set()
# for w in words:
# w_morse = ''
# for c in w:
# w_morse = w_morse + codes[ord(c)-ord('a')]
# d.add(w_morse)
# return len(d)
# d = set()
# for word in words:
# w_morse = ''.join(codes[ord(c)-ord('a')] for c in word)
# d.add(w_morse)
# return len(d)
return len(set([(''.join(codes[ord(c)-ord('a')] for c in word)) for word in words]))
执行用时:36 ms, 在所有 Python3 提交中击败了76.80%的用户
内存消耗:15.1 MB, 在所有 Python3 提交中击败了29.04%的用户
以上代码中包含了三种写法,最后得到的是非常Python风格(pythonic)的一行代码,非常紧凑。一上来直接这样写不容易,可以分布走,先写傻一点的,然后再逐步浓缩。
回到主目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)