使用HashSet的特性来解决“唯一的摩尔斯密码词”问题

八、唯一的摩尔斯密码词

8.1、题设要求

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

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

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

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

示例 1:

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

示例 2:

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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-morse-code-words

8.2、解题思路

​​  先定义一个摩尔斯密码字典,再将字符串数组中的每个单词取出来并依次进行循环,将每个单词中的每个字母进行转换再拼接,然后把拼接好的莫尔斯密码保存到HashSet中(这时我们使用了HashSet的唯一性,HashSet中只会将一个类型存储一次,故HashSet中的元素是不存在重复的),最后再将HashSet的大小返回即可。

8.3、算法

class Solution {
    public int uniqueMorseRepresentations(String[] words) {
        //先定义一个摩尔斯密码字典
        String[] MORSE = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};

        Set<String> set = new HashSet<>();
        //将字符串数组中的每个单词取出来并依次进行循环
        for(String word : words){
            //使用StringBuilder将转换的密码储存起来
            StringBuilder sb = new StringBuilder();
            //使用每个单词的长度进行循环
            for(int i = 0;i < word.length();i++){
                //将每个单词中的每个字母取出来
                char c = word.charAt(i);
                //将每个单词转换成摩尔斯密码并进行拼接
                //MORSE[c - 'a']将每个单词进行转换
                //code.append()将转换的单词进行拼接
                sb.append(MORSE[c - 'a']);
            }
            //将转换后的结果存入到HashSet中,这里我们使用到了HashSet的唯一性
            //因为HashSet中的值是唯一的,所以重复的类型会被去掉
            set.add(sb.toString());
        }
        //最后,我们只需要返回HashSet的大小即可
        return set.size();
    }
}
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&小小白&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值