804.唯一的摩尔斯密码词

警告
本文最后更新于 2020-04-17,文中内容可能已过时。

国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串,比如:“a” 对应 “.-",“b” 对应 “-…",“c” 对应 “-.-.” 等等。

为了方便,将所有26个字母对应的摩尔斯密码表如下:

1
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]

给定一个单词列表,每个单词可以写成每个字母对应的摩尔斯密码的组合。例如,“cba” 可以写成 “-.-..–…",(即 “-.-.” + “.-” + “-…” 字符串的结合)。我们将这样一个连接过程称作单词翻译。

返回我们可以获得所有不同单词翻译的数量。

示例 :

1
2
3
4
5
6
7
8
9
输入:words = ["gin", "zen", "gig", "msg"]
输出:2
解释:各单词翻译如下:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."

共有 2 种不同翻译, "--...-." 和 "--...--.".

注意:

  1. 每个单词表$ \tt{words} $的长度不会超过$ \tt{100} $;
  2. 每个单词$ \tt{words[i]} $的长度范围为$ \tt{[1, 12]} $;
  3. 每个单词$ \tt{words[i]} $只包含小写字母。

思路及解法

我们将数组$ \tt{words} $中的每个单词转换为摩尔斯码,并加入哈希集合(HashSet)中,最终的答案即为哈希集合中元素的个数。

代码

Java:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class Solution {
    public int uniqueMorseRepresentations(String[] words) {
        String[] MORSE = new String[]{".-","-...","-.-.","-..",".","..-.","--.",
                         "....","..",".---","-.-",".-..","--","-.",
                         "---",".--.","--.-",".-.","...","-","..-",
                         "...-",".--","-..-","-.--","--.."};

        Set<String> seen = new HashSet();
        for (String word: words) {
            StringBuilder code = new StringBuilder();
            for (char c: word.toCharArray())
                code.append(MORSE[c - 'a']);
            seen.add(code.toString());
        }

        return seen.size();
    }
}

Python:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution(object):
    def uniqueMorseRepresentations(self, words):
        MORSE = [".-","-...","-.-.","-..",".","..-.","--.",
                 "....","..",".---","-.-",".-..","--","-.",
                 "---",".--.","--.-",".-.","...","-","..-",
                 "...-",".--","-..-","-.--","--.."]

        seen = {"".join(MORSE[ord(c) - ord('a')] for c in word)
                for word in words}

        return len(seen)

复杂度分析:

  • 时间复杂度:$ \rm{O(S)} $,其中$ \tt{S} $是数组$ \tt{words} $中所有单词的长度之和。
  • 空间复杂度:$ \rm{O(S)} $。