180 - 140 单词拆分2
题目
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入: s = "catsanddog" wordDict = ["cat", "cats", "and", "sand", "dog"] 输出: [ "cats and dog", "cat sand dog" ]
示例 2:
输入: s = "pineapplepenapple" wordDict = ["apple", "pen", "applepen", "pine", "pineapple"] 输出: [ "pine apple pen apple", "pineapple pen apple", "pine applepen apple" ] 解释: 注意你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog" wordDict = ["cats", "dog", "sand", "and", "cat"] 输出: []
解答
学了回溯,看啥都像可以用回溯的样子
from collections import deque
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
if len(s) == 0:
return []
word_set = {word for word in wordDict}
dp = [0 for _ in range(len(s)+1)]
dp[0] = 1
for i in range(1, len(s)+1):
for j in range(i):
if dp[j]and s[j:i] in word_set:
dp[i] = 1
break
res = []
def dfs(s, length, word_set, res, path, dp):
if length == 0:
res.append(" ".join(path))
return
for i in range(length):
if dp[i]:
suffix = s[i:length]
if suffix in word_set:
path.appendleft(suffix)
dfs(s, i, word_set, res, path, dp)
path.popleft()
if dp[-1]:
queue = deque()
dfs(s, len(s), word_set, res, queue, dp)
return res
Runtime: 44 ms, faster than 85.87% of Python3 online submissions for Word Break II.
Memory Usage: 12.9 MB, less than 100.00% of Python3 online submissions for Word Break II.
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
from collections import defaultdict
if len(s) == 0:
return []
cuts = [False]*(len(s)+1)
cuts[0] = True
segs = defaultdict(list)
for i in range(1, len(s)+1):
for j in range(i):
rst = cuts[j]and (s[j:i]in wordDict)
if rst is True:
cuts[i] = rst
segs[j].append(i)
ret = []
def backtrack(segs, start, path, ret):
if start == len(s):
ret.append(" ".join(path))
return True
else:
for j in segs[start]:
path.append(s[start:j])
backtrack(segs, j, path, ret)
path.pop()
if cuts[-1]is True:
backtrack(segs, 0, [], ret)
return ret
Runtime: 112 ms, faster than 19.34% of Python3 online submissions for Word Break II.
Memory Usage: 12.8 MB, less than 100.00% of Python3 online submissions for Word Break II.
Last updated
Was this helpful?