这是我参与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 <= 1001 <= words[i].length <= 12words[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)