阿巩
突发性更新!
“菜鸟的每日力扣”是新开的一个系列,记录菜鸟阿巩在力扣每日一题的解法,用最接地气的方式梳理逻辑。题解一定不是最优质的,不过它会激发起你“我也想试一试”的解题斗志。话不多说,我们来一起看下今天的第472题 连接词。
拿到题目最先想到的是用哈希来解,大概思路是首先按单词的长度排序,短的排在前面,然后分别去判断每个单词是否是由前面的较短的单词组成。我们先放代码,之后我们看下具体过程:
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大法在各个循环前打印出来看下逻辑运行过程:
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