【刷题日记】804. 唯一摩尔斯密码词

813 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

【刷题日记】804. 唯一摩尔斯密码词

本次刷题日记的第 29 篇,力扣题为:804. 唯一摩尔斯密码词简单

一、题目描述:

今天周日,咱们也要保持习惯,leetcode 的今天每日一题是 一摩尔斯密码词,乍一看我们是不是也可以解密摩尔斯密码了?感觉有点意思

周日,leetcode 也想让咱放松一下,刷一个比较还理解的题目,一起来看看

二、这道题考察了什么思想?你的思路是什么?

这道题,给出了哪些重要点的信息呢:

  • 给出了从字母 a 到 字母 z 对应的字符串映射关系,这个映射关系我们不用刻意关注,哪怕变成其他的映射关系也无所谓,重点是我们只是他们是一一映射的就可以了
  • 题目要求,给出单词,我们要转换成对应的字符串,且在给出的单词数组中,不同的单词,可能存在相同的拼接结果字符串,那么,我们需要计算出,这些结果字符串中,不同种类的字符串翻译

看到上述给出的重点信息,对应让我们从字母或者单词,按照映射关系翻译成对应的字符串,这个没有啥好说的

直接写一个帮助列表,a-z 的字母,正好对应0-25 的列表索引,根据索引找到对应字符串,最后拼接起来即可

例如这样

那么我们可以很轻易的的拼接成字符串了,如何找到出不同的字符串呢

我们可以使用 hash 表来进行解决,hash 表的话,我们直接就可以使用 golang 中的 map 可以处理, c++ 中的 set 也可以处理,只要 key 是不会重复的就可以处理了

按照上述的思路,我们就可以很明确的得到这题的解决方式了,接下来,咱们就将上述思路,翻译成代码即可,思路还是很清晰的吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,编码的时候,这里需要注意

  • 需要创建好一个帮助列表,存放,每一个字母对应的字符串
  • 使用 hash 表来处理和提取结果字符串的种类

编码如下:

func uniqueMorseRepresentations(words []string) int {
    // 先写一个帮助列表
    var helper = []string{
        ".-", "-...", "-.-.", "-..", ".", "..-.", "--.",
        "....", "..", ".---", "-.-", ".-..", "--", "-.",
        "---", ".--.", "--.-", ".-.", "...", "-", "..-",
        "...-", ".--", "-..-", "-.--", "--..",
    }
    m := map[string]int{}
    // 遍历单词
    for _,word := range words {
        // 开始处理每一个单词
        tmp := ""
        for _,ch := range word {
            tmp += helper[ch - 'a']
        }
        m[tmp]++
    }
    return len(m)
}

看完上述编码,还是很简单明了的,但是写过 golang 的兄弟,知道咱们直接拼接字符串效率是比较低, 我们可以使用 golang 自带的库, strings ,将上述关键代码替换成这样

tmp := &strings.Builder{}
tmp.WriteString(helper[ch-'a'])
m[trans.String()]++

使用 strings.Builder 和 直接使用拼接字符串相比 strings.Builder 效率会高很多,具体原因是为什么,xdm 可以思考一下

四、总结:

此处,我们可以看到本题的时间复杂度是 O(S) ,此处的 S 可不是 单词的数量,而是每个单词的字符长度和,仔细看上述编码,咱们其实遍历的是每个单词的字符

此处的空间复杂度也是 O(S) ,我们创建的 tmp 字符串,开辟的空间也是如此

原题地址:804. 唯一摩尔斯密码词

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~