题目
思路
DP+DFS
用dp[i]表示下标为i之前的字符都匹配上了,用来作为剪枝条件。
代码
class Solution(object):
def __init__(self):
self.res_list = []
def dfs(self, s, wordDict, startIndex, word_list, dp):
if startIndex == len(s):
self.res_list.append(" ".join(word_list[:]))
return
if not dp[startIndex]: return
for endIndex in range(startIndex, len(s)):
if s[startIndex:endIndex + 1] in wordDict:
word_list.append(s[startIndex:endIndex + 1])
self.dfs(s, wordDict, endIndex + 1, word_list, dp)
word_list.pop(-1)
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: List[str]
"""
dp = [0 for i in range(len(s) + 1)]
dp[0] = 1
for i in range(len(s)):
if dp[i]:
for j in range(1, len(s) + 1):
if i + j < len(s) + 1 and wordDict.count(s[i:i + j]) > 0:
dp[i + j] = 1
if dp[len(s)] == 0: return []
self.dfs(s, wordDict, 0, [], dp)
return self.res_list