LeetCode --- 字符串系列 --- 唯一摩尔斯密码词

唯一摩尔斯密码词

本题涉及 Set 的使用
附上 Set 的随笔
集合 Set

题目

国际摩尔斯密码定义一种标准编码方式

将每个字母对应于一个由一系列点和短线组成的字符串

比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。

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

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

给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。

例如,"cab" 可以写成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的结合)。

我们将这样一个连接过程称作单词翻译。

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


示例

示例 1:

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

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/unique-morse-code-words

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题思路

普通方式

定义变量数组 res = []
1、第一层循环遍历 `单词数组` 拿到 `单词元素 word`
2、
因为都是 `小写字母` , `小写字母` 第一位 a 的数值编号是 97;
我们需要从 `摩斯数组` 中,取 a 以及其后的字母对应的摩斯码,就要使用字母的数值编号 - 97,得到摩斯数组中对应的下标
3、第二层循环遍历拿到的 `单词元素 word`,根据上面的计算逻辑,进行字母的摩斯码替换;
用一个变量 mosStr 拼接,得到该单词元素的 `摩斯码`
4、第二层循环结束后,使用变量 `数组 res` 存储上面得到的单词元素 `摩斯码` mosStr
5、将 mosStr 与 res 里面的元素进行对比,是否存在于 res 中,做去重处理
6、最后,返回 res 的长度

Set 集合去重

定义集合 res = new Set()
1、第一层循环遍历 `单词数组` 拿到 `单词元素 word`
2、
因为都是 `小写字母` , `小写字母` 第一位 a 的数值编号是 97;
我们需要从 `摩斯数组` 中,取 a 以及其后的字母对应的摩斯码,就要使用字母的数值编号 - 97,得到摩斯数组中对应的下标
3、第二层循环遍历拿到的 `单词元素 word`,根据上面的计算逻辑,进行字母的摩斯码替换;用一个变量 mosStr 拼接,得到该单词元素的 `摩斯码`
4、第二层循环结束后,使用 `集合 res` 存储上面得到的单词元素 `摩斯码` mosStr
5、因为集合唯一性的特性,确保每个元素都不重复,所以 res 的 size 就是最终的答案

题解

普通方式

let uniqueMorseRepresentations = function(words) {
    let mos = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
    let res = []
    // 第一层循环遍历 `单词数组` 拿到 `单词元素 word`
    words.forEach(word => {
        let mosStr = ''
        for (let i = 0; i < word.length; i++) {
            // 因为都是 `小写字母` , `小写字母` 第一位 a 的数值编号是 97;
            // 我们需要从 `摩斯数组` 中,取 a 以及其后的字母对应的摩斯码
            // 就要使用字母的数值编号 - 97,得到摩斯数组中对应的下标
            let strNum = word[i].charCodeAt()
            // 变量 mosStr 拼接,得到该单词元素的 `摩斯码`
            mosStr += mos[strNum - 97]
        }
        let judge = true
        for (let n = 0; n < res.length; n++) {
            // 将 mosStr 与 res 里面的元素进行对比,是否存在于 res 中,做去重处理
            if (res[n] === mosStr) {
                judge = false
                break;
            }
        }
        if (judge) {
            // `数组 res` 存储上面得到的单词元素 `摩斯码` mosStr
            res.push(mosStr)
        }
    })
    return res.length
};

或者

使用 Set 集合去重

let uniqueMorseRepresentations = function(words) {
    let mos = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
    let res = new Set()
    // 第一层循环遍历 `单词数组` 拿到 `单词元素 word`
    words.forEach(word => {
        let mosStr = ''
        for (let i = 0; i < word.length; i++) {
            // 因为都是 `小写字母` , `小写字母` 第一位 a 的数值编号是 97;
            // 我们需要从 `摩斯数组` 中,取 a 以及其后的字母对应的摩斯码
            // 就要使用字母的数值编号 - 97,得到摩斯数组中对应的下标
            let strNum = word[i].charCodeAt()
            // 变量 mosStr 拼接,得到该单词元素的 `摩斯码`
            mosStr += mos[strNum - 97]
        }
        // 因为集合唯一性的特性,确保每个元素都不重复,所以 res 的 size 就是最终的答案
        res.add(mosStr)
    })
    return res.size
};

都读到最后了、留下个建议如何
原文地址:https://www.cnblogs.com/linjunfu/p/12639613.html