哈希表题目:唯一摩尔斯密码词

题目

标题和出处

标题:唯一摩尔斯密码词

出处:804. 唯一摩尔斯密码词

难度

2 级

题目描述

要求

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

  • "a" \texttt{"a"} "a" 对应 ".-" \texttt{".-"} ".-"
  • "b" \texttt{"b"} "b" 对应 "-..." \texttt{"-..."} "-..."
  • "c" \texttt{"c"} "c" 对应 "-.-." \texttt{"-.-."} "-.-.",以此类推。

为了方便,所有 26 \texttt{26} 26 个英语字母对应摩尔斯密码表如下:

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

给定一个字符串数组 words \texttt{words} words,数组中的每个单词可以写成每个字母对应摩尔斯密码的组合。

  • 例如, "cab" \texttt{"cab"} "cab" 可以写成 "-.-..--..." \texttt{"-.-..--..."} "-.-..--...",即 "-.-." \texttt{"-.-."} "-.-." ".-" \texttt{".-"} ".-" "-..." \texttt{"-..."} "-..." 的连接。我们将这样一个连接过程称作单词翻译。

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

示例

示例 1:

输入: words   =   ["gin","zen","gig","msg"] \texttt{words = ["gin","zen","gig","msg"]} words = ["gin","zen","gig","msg"]
输出: 2 \texttt{2} 2
解释:各单词翻译如下:
"gin" → "--...-." \texttt{"gin"} \rightarrow \texttt{"--...-."} "gin""--...-."
"zen" → "--...-." \texttt{"zen"} \rightarrow \texttt{"--...-."} "zen""--...-."
"gig" → "--...--." \texttt{"gig"} \rightarrow \texttt{"--...--."} "gig""--...--."
"msg" → "--...--." \texttt{"msg"} \rightarrow \texttt{"--...--."} "msg""--...--."
共有 2 \texttt{2} 2 种不同翻译: "--...-." \texttt{"--...-."} "--...-." "--...--." \texttt{"--...--."} "--...--."

示例 2:

输入: words   =   ["a"] \texttt{words = ["a"]} words = ["a"]
输出: 1 \texttt{1} 1

数据范围

  • 1 ≤ words.length ≤ 100 \texttt{1} \le \texttt{words.length} \le \texttt{100} 1words.length100
  • 1 ≤ words[i].length ≤ 12 \texttt{1} \le \texttt{words[i].length} \le \texttt{12} 1words[i].length12
  • words[i] \texttt{words[i]} words[i] 由小写英语字母组成

解法

思路和算法

为了得到不同单词翻译的数量,需要将数组 words \textit{words} words 中的所有单词使用摩尔斯密码翻译,记录所有的单词翻译,去除重复项之后统计不同单词翻译的数量。

创建数组存储全部英语字母对应摩尔斯密码表,然后对于每个单词,遍历单词中的每个字母,得到每个字母对应的摩尔斯密码,连接之后即可得到单词翻译。

为了去除重复的单词翻译,使用哈希集合存储每个单词的单词翻译,哈希集合中的任意两个单词翻译都是不同的。遍历全部单词之后,哈希集合内的元素个数即为不同单词翻译的数量。

代码

class Solution {
    public int uniqueMorseRepresentations(String[] words) {
        String[] morseArray = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        Set<String> set = new HashSet<String>();
        for (String word : words) {
            StringBuffer sb = new StringBuffer();
            int length = word.length();
            for (int i = 0; i < length; i++) {
                char c = word.charAt(i);
                sb.append(morseArray[c - 'a']);
            }
            set.add(sb.toString());
        }
        return set.size();
    }
}

复杂度分析

  • 时间复杂度: O ( ∑ l w + ∑ l m ) O(\sum l_w + \sum l_m) O(lw+lm),即数组 words \textit{words} words 中所有单词的长度之和与所有单词对应的单词翻译的长度之和。需要 O ( ∑ l w ) O(\sum l_w) O(lw) 的时间遍历所有单词,对于每个单词,生成单词翻译和存入哈希表的时间为该单词对应的单词翻译的长度,因此对所有单词生成单词翻译和存入哈希表的时间为 O ( ∑ l m ) O(\sum l_m) O(lm)。总时间复杂度为 O ( ∑ l w + ∑ l m ) O(\sum l_w + \sum l_m) O(lw+lm)

  • 空间复杂度: O ( ∑ l m ) O(\sum l_m) O(lm),即数组 words \textit{words} words 中所有单词对应的单词翻译的长度之和。需要使用哈希表存储每个单词对应的单词翻译,最坏情况下,每个单词对应的单词翻译都不同,此时哈希表的空间为所有单词对应的单词翻译的长度之和。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伟大的车尔尼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值