Leetcode每日一题
题目链接: 140. 单词拆分 II
难度: 困难
解题思路: 本题可以通过DFS来进行解答。但是裸DFS会导致超时,卡在如下的样例:
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]
所以需要对算法进行优化,进行记忆化剪枝,我们可以记录某个位置开始的划分是否是可以分割的。若他不能分割那么以后就不在处理这个情况。代码中的visit数组即为记录以某个开始的后续是否可以分割。当结果有增加则说明可以进行分割,无增加这说明不能分割。
题解:
class Solution:
def dfs(self, s, words: List[str], wordDict: List[str], p: int, lens: int):
prelen = len(self.result)
if p == lens:
self.result.append(' '.join(words))
return
for i in range(p, lens + 1):
w = s[p : i]
if (self.visit[i] == 1) and (w in wordDict):
words.append(w)
self.dfs(s, words, wordDict, i, lens)
words.pop()
# print(prelen, len(words))
if len(self.result) > prelen: # 有结果增加说明可以分割
self.visit[p] = 1
else:
self.visit[p] = 0
def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
if s == None or wordDict == None:
return []
lens = int(len(s))
self.result = []
self.visit = [1] * (lens + 1) # 判断以某个开始的后续是否可以分割
self.dfs(s, [], set(wordDict), 0, lens)
# print(self.visit)
return self.result