解法
memo存放的是s中已经匹配的部分的首位坐标,例如s = “leetcode”, wordDict = [“leet”, “code”]则memo=[0,4,8]
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
memo=[0]
for i in range(len(s)+1):
for j in memo:
if s[j:i] in wordDict:
memo.append(i)
break
return memo[-1]==len(s)
from collections import deque
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: List[str]
"""
size = len(s)
word_set = {word for word in wordDict}
dp = [False for _ in range(size)]
dp[0] = s[0] in word_set
for r in range(1, size):
if s[:r + 1] in word_set:
dp[r] = True
continue
for l in range(r):
if dp[l] and s[l + 1: r + 1] in word_set:
dp[r] = True
break
res = []
if dp[-1]:
queue = deque()
self.dfs(s, size - 1, wordDict, res, queue, dp)
return res
def dfs(self, s, end, word_set, res, path, dp):
if s[:end + 1] in word_set:
path.appendleft(s[:end + 1])
res.append(' '.join(path))
path.popleft()
for i in range(end):
if dp[i]:
suffix = s[i + 1:end + 1]
if suffix in word_set:
path.appendleft(suffix)
self.dfs(s, i, word_set, res, path, dp)
path.popleft()