0
点赞
收藏
分享

微信扫一扫

Leetcode0804. 唯一摩尔斯密码词(simple)

犹大之窗 2022-04-13 阅读 31

目录

1. 题目描述

2. 解题分析

3. 代码实现


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解题笔记(动态更新。。。)

举报

相关推荐

0 条评论