LeetCode:804. 唯一摩尔斯密码词

本文探讨了如何计算一组单词转换为摩尔斯电码后的不同组合数量,介绍了一种使用HashSet和StringBuilder的高效算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

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

给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。

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

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

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

 

注意:

  • 单词列表words 的长度不会超过 100
  • 每个单词 words[i]的长度范围为 [1, 12]
  • 每个单词 words[i]只包含小写字母。

题解

该题主要问题在于如何判断字符在莫斯表中的位置:
tmp += Morse[word.indexOf(each.charAt(i))];
以及如何判断该莫斯密码是否在结果中,添加flag,因为要遍历全部元素:
result[i].equals(tmp)
这里用result[i] == tmp判断会出错。

==运用在基本数据类型的时候,通过比较它们实际的值来判断是否相同;而用于比较引用数据类型的时候,则是比较俩个引用的地址是否相等,也就是是否指向一个对象。
equals方法是java.lang.Object的方法,也就是所有的java类都会有的方法。它可以被程序员覆盖重写,通过自定义的方式来判断俩个对象是否相等。对于字符串java.lang.String类来说,它的equals方法用来比较字符串的字符序列是否完全相等.

傻瓜式题解
class Solution {
    public int uniqueMorseRepresentations(String[] words) {
        String[] result = new String[words.length];
        String[] Morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        String word = "abcdefghijklmnopqrstuvwxyz";
        
        int count = 0;
        for(String each : words){
            String tmp = "";
            for(int i = 0;i < each.length();i++){
               tmp += Morse[word.indexOf(each.charAt(i))];
            }            
            boolean flag = true;
            for(int i = 0;i < count;i++){
                if(result[i].equals(tmp)){
                    flag = false;
                    break;
                }                
            }
            if(flag){
                result[count++] = tmp;
            }
            
        }
        return count;      
    }
}
使用HashSetStringbuildertoCharArray()题解
class Solution {
    public int uniqueMorseRepresentations(String[] words) {
       String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        if(words == null) return 0;
        HashSet<String> hashSet = new HashSet<String>();
        for(String str : words){
            StringBuilder sb = new StringBuilder();
            for(char c : str.toCharArray()){
                sb.append(morse[c - 'a']);
            }
            hashSet.add(sb.toString()); //将StringBuilder 类型转为String
        }
        return hashSet.size();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值