前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >菜鸟的每日力扣系列——472. 连接词

菜鸟的每日力扣系列——472. 连接词

作者头像
才浅Coding攻略
发布2022-12-12 17:27:40
1740
发布2022-12-12 17:27:40
举报
文章被收录于专栏:才浅coding攻略

阿巩

突发性更新!

“菜鸟的每日力扣”是新开的一个系列,记录菜鸟阿巩在力扣每日一题的解法,用最接地气的方式梳理逻辑。题解一定不是最优质的,不过它会激发起你“我也想试一试”的解题斗志。话不多说,我们来一起看下今天的第472题 连接词。

拿到题目最先想到的是用哈希来解,大概思路是首先按单词的长度排序,短的排在前面,然后分别去判断每个单词是否是由前面的较短的单词组成。我们先放代码,之后我们看下具体过程:

代码语言:javascript
复制
from typing import List

def findAllConcatenatedWordsInADict(words: List[str]) -> List[str]:
    words.sort(key=len)  # 原地排序
    min_len = max(1, len(words[0]))  # 设置初始值为首个字符串长度
    prev: set = set()  # 用集合去重
    res: list = []
    
    def check(word):
        if word in prev:
            return True
        for i in range(min_len, len(word) + 1):
            if word[:i] in prev and check(word[i:]):
                return True
        return False
        
    for word in words:
        if check(word):
            res.append(word)
        prev.add(word)
    return res

words = ["cat", "cats", "catsdogcats", "dog", "dogcatsdog", "hippopotamuses", "rat", "ratcatdogcat"]
print(findAllConcatenatedWordsInADict(words))
#结果是:['dogcatsdog', 'catsdogcats', 'ratcatdogcat']

我们用很low但有效的print大法在各个循环前打印出来看下逻辑运行过程:

代码语言:javascript
复制
words= ['cat', 'dog', 'rat', 'cats', 'dogcatsdog', 'catsdogcats', 'ratcatdogcat', 'hippopotamuses']
word= cat
i= 3 word[:i]= cat word[i:]= 
prev= {'cat'}
word= dog
i= 3 word[:i]= dog word[i:]= 
prev= {'dog', 'cat'}
word= rat
i= 3 word[:i]= rat word[i:]= 
prev= {'dog', 'rat', 'cat'}
word= cats
i= 3 word[:i]= cat word[i:]= s
word= s
i= 4 word[:i]= cats word[i:]= 
prev= {'dog', 'rat', 'cats', 'cat'}
word= dogcatsdog
i= 3 word[:i]= dog word[i:]= catsdog
word= catsdog
i= 3 word[:i]= cat word[i:]= sdog
word= sdog
i= 3 word[:i]= sdo word[i:]= g
i= 4 word[:i]= sdog word[i:]= 
i= 4 word[:i]= cats word[i:]= dog
word= dog
res= ['dogcatsdog']
prev= {'dog', 'cat', 'rat', 'cats', 'dogcatsdog'}
word= catsdogcats
i= 3 word[:i]= cat word[i:]= sdogcats
word= sdogcats
i= 3 word[:i]= sdo word[i:]= gcats
i= 4 word[:i]= sdog word[i:]= cats
i= 5 word[:i]= sdogc word[i:]= ats
i= 6 word[:i]= sdogca word[i:]= ts
i= 7 word[:i]= sdogcat word[i:]= s
i= 8 word[:i]= sdogcats word[i:]= 
i= 4 word[:i]= cats word[i:]= dogcats
word= dogcats
i= 3 word[:i]= dog word[i:]= cats
word= cats
res= ['dogcatsdog', 'catsdogcats']
prev= {'catsdogcats', 'dog', 'cat', 'rat', 'cats', 'dogcatsdog'}
word= ratcatdogcat
i= 3 word[:i]= rat word[i:]= catdogcat
word= catdogcat
i= 3 word[:i]= cat word[i:]= dogcat
word= dogcat
i= 3 word[:i]= dog word[i:]= cat
word= cat
res= ['dogcatsdog', 'catsdogcats', 'ratcatdogcat']
prev= {'catsdogcats', 'dog', 'cat', 'rat', 'cats', 'ratcatdogcat', 'dogcatsdog'}
word= hippopotamuses
i= 3 word[:i]= hip word[i:]= popotamuses
i= 4 word[:i]= hipp word[i:]= opotamuses
i= 5 word[:i]= hippo word[i:]= potamuses
i= 6 word[:i]= hippop word[i:]= otamuses
i= 7 word[:i]= hippopo word[i:]= tamuses
i= 8 word[:i]= hippopot word[i:]= amuses
i= 9 word[:i]= hippopota word[i:]= muses
i= 10 word[:i]= hippopotam word[i:]= uses
i= 11 word[:i]= hippopotamu word[i:]= ses
i= 12 word[:i]= hippopotamus word[i:]= es
i= 13 word[:i]= hippopotamuse word[i:]= s
i= 14 word[:i]= hippopotamuses word[i:]= 
prev= {'catsdogcats', 'dog', 'cat', 'rat', 'cats', 'ratcatdogcat', 'dogcatsdog', 'hippopotamuses'}
['dogcatsdog', 'catsdogcats', 'ratcatdogcat']

对于这道题,更适合的方法是用字典树(DP也可以),用DFS让每个单词在这课字典树上跑,看是否由多个单词组成,字典树的插入/查询复杂度是O(k), k是单个字符串的长度,不过这个阿巩比较屑还不太会用,感兴趣的话可以看下大佬们的解法:

https://leetcode-cn.com/problems/concatenated-words/

日拱一卒,明儿见~

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 才浅coding攻略 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档