对于该题,我想到的策略是递归判断。
对于一个字符串word,在某处切分成left_word,和right_word,如果已经知道left_word是一个在给定单词集合中的,然后再递归判断right_word即可。
不过重复的判断串太多了,我们用缓存记录一下已经被判定为是连接词的词。
值得注意的是需要先把空串过滤掉,否则容易无线递归。PS:lc加强了用例
class Solution:
def findAllConcatenatedWordsInADict(self, words: List[str]) -> List[str]:
self.cache=set()
if not words:
return []
word_dict={}
for w in words:
if not w:
continue
word_dict[w]=True
def check(word_dict,word,cur,cnt):
if cur in self.cache:
return True
if word_dict.get(cur,False):
cnt+=1
if cnt>1:
self.cache.add(word)
return True
else:
return False
i=0
while i<len(cur)+1:
lw,rw=cur[:i],cur[i:]
if word_dict.get(lw,False):
if check(word_dict,word,rw,cnt+1):
return True
i+=1
return False
ret=[]
for w in words:
if not w:
continue
word_dict[w]=False
if check(word_dict,w,w,0):
ret.append(w)
word_dict[w]=True
return ret