唯一莫尔斯密码词

78 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。每天一道算法题,督促自己。

靡不有初,鲜克有终,加油坚持下去。

问题:

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

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

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

例如,"cab" 可以写成 "-.-..--..." ,(即 "-.-." + ".-" + "-..." 字符串的结合)。我们将这样一个连接过程称作 单词翻译 。 对 words 中所有单词进行单词翻译,返回不同 单词翻译 的数量。

示例:(放代码里面)

示例1:
输入: words = ["gin", "zen", "gig", "msg"]
输出: 2

示例2:
输入:words = ["a"]
输出:1

思路:首先将把所有字母对应的 map 存起来(手动存储的,哈哈哈),然后循环遍历 words数组 ,并把每个转成对应的摩斯密码,还要进行数组去重,保证返回的都是不同的单词翻译,最后返回不同单词翻译数量。

基于上述思考,代码如下:

/**
 * @param {string[]} words
 * @return {number}
 */
var uniqueMorseRepresentations = function(words) {
    // 1
    const map = {"a":".-","b":"-...","c":"-.-.","d":"-..","e":".","f":"..-.","g":"--.","h":"....","i":"..","j":".---","k":"-.-","l":".-..","m":"--","n":"-.","o":"---","p":".--.","q":"--.-","r":".-.","s":"...","t":"-","u":"..-","v":"...-","w":".--","x":"-..-","y":"-.--","z":"--.."}
    const arr = words.map(item => {
        let str = ''
        for (let i = 0;i < item.length;i ++) {
            str += map[item[i]]
        }
        return str
    })
    return new Set(arr).size
};

执行结果如下图:执行结果达到了百分之九十多,效果还是很不错的。

image-20230510003457112.png

结论:总结,这个题目看起来不怎么难,但是写起来还是难的,而且我一开始根本没有想到使用map,是看了评论才知道用map的,最近越来越依赖评论了,自己有些题都没有思路了,太菜了,一点都不酷。