这一题和上一题单词拆分1思想一样,但是实现更为复杂。这一题要求写出可以拆分成的单词们。
解题:试了暴力递归超时。上一题的动态规划思想在这一题中没法写出具体的种类。但是还是有一种记忆化的方法。直接上代码
代码:
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
return self.findword(s,wordDict,{})
def findword(self,s,wordDict,m):
#m是一个字典,key是字符串s,value是组成s的字符串们,
#如果m中有s,那就直接返回就行
if s in m:
return m[s]
#这里表示的是字符串递归寻找结束了,前面的单词都在字典中
if not s:
return 'ok'
res=[]
#对字典中的每一个单词都对比寻找
for i in wordDict:
if s[:len(i)]!=i:
continue
exres=self.findword(s[len(i):],wordDict,m)
#返回的是ok,说明这个单词是这一次寻找的最后一个单词,且该单词在字典里,直接加入
#到res即可
if exres=='ok':
res.append(i)
#说明不是最后一个且s[len(i):]是由字典里面的单词组成
elif exres:
for j in exres:
res.append(i+' '+j)
#还有一种当然就是返回[]了,就是s[len(i):]不是是由字典单词构成
# elif not exres:
# pass
m[s]=res
return res