LeetCode.804 唯一摩尔斯密码词

179 阅读1分钟

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

题目描述:

804. 唯一摩尔斯密码词 - 力扣(LeetCode) (leetcode-cn.com)

国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如:

'a' 对应 ".-"'b' 对应 "-..."'c' 对应 "-.-." ,以此类推。 为了方便,所有 26 个英文字母的摩尔斯密码表如下:

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

给你一个字符串数组 words ,每个单词可以写成每个字母对应摩尔斯密码的组合。

例如,"cab" 可以写成 "-.-..--..." ,(即 "-.-." + ".-" + "-..." 字符串的结合)。我们将这样一个连接过程称作 单词翻译

words 中所有单词进行单词翻译,返回不同 单词翻译 的数量。

示例一

输入: words = ["gin", "zen", "gig", "msg"]
输出: 2
解释: 
各单词翻译如下:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."

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

示例二

输入: words = ["a"]
输出: 1

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 12
  • words[i] 由小写英文字母组成

思路分析

哈希表

乍一看题目内容非常多,又是什么摩尔斯密码的,其实抛开这场景,就是一个哈希表的问题。

我们将数组 word 中的每个单词转换为摩尔斯码,并加入哈希表中,最终的答案即为哈希集合中元素的个数。

AC代码

class Solution {
    companion object {
        val MORSE_CODE_TABLE = arrayOf(".-", "-...", "-.-.", "-..", ".", "..-.",
            "--.", "....", "..", ".---", "-.-", ".-..",
            "--", "-.", "---", ".--.", "--.-", ".-.",
            "...", "-", "..-", "...-", ".--", "-..-",
            "-.--", "--..")
    }

    fun uniqueMorseRepresentations(words: Array<String>): Int {
        val set = HashSet<String>()
        for (word in words) {
            val charArray = word.toCharArray()
            val sb = StringBuilder()
            for (char in charArray) {
                sb.append(MORSE_CODE_TABLE[char - 'a'])
            }
            set.add(sb.toString())
        }
        return set.size
    }
}

总结

这一题找到问题的本质就很容易解答了,无脑遍历即可,如果想追求更简洁的代码,可以试试内置的reduce函数等。

参考

唯一摩尔斯密码词 - 唯一摩尔斯密码词 - 力扣(LeetCode) (leetcode-cn.com)

【C++】【数组映射】【哈希表】 - 唯一摩尔斯密码词 - 力扣(LeetCode) (leetcode-cn.com)