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


    题目

    标题和出处

    标题:唯一摩尔斯密码词

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

    难度

    2 级

    题目描述

    要求

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

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

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

    [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
    
    • 1

    给定一个字符串数组 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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    复杂度分析

    • 时间复杂度: 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 中所有单词对应的单词翻译的长度之和。需要使用哈希表存储每个单词对应的单词翻译,最坏情况下,每个单词对应的单词翻译都不同,此时哈希表的空间为所有单词对应的单词翻译的长度之和。

  • 相关阅读:
    计算机组成原理笔记(王道考研) 第四章:指令系统
    【C++】C++入门
    美国服务器租用详细介绍与租用流程
    java计算机毕业设计咖啡屋订单系统源码+mysql数据库+系统+lw文档+部署
    [架构设计] 创建型模型
    vue入门
    Not Found: /assets/js/ie8-responsive-file-warning.js求解决
    【Python】成功解决NameError: name ‘X’ is not defined
    【HTML】制作一个简单的三角形动态图形
    Word不计算封面、目录页数将正文页码修改为第几页共几页的格式
  • 原文地址:https://blog.csdn.net/stormsunshine/article/details/121451368