给定一个非空字符串 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"]
输出:
[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
法一:DFS
法二:dp+DFS
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: List[str]
"""
if not s or not wordDict:return []
# 求单词最大长度
max_len=max(map(len,wordDict))
n=len(s)
dp=[False]*n
self.res=[]
for i in range(n):
start=max(-1,i-max_len)
for j in range(start,i+1):
if j==-1 or dp[j]==True:
if s[j+1:i+1] in wordDict:
dp[i]=True
break
if not dp[-1]:return []
self.dfs(0,s,wordDict,dp,'')
return self.res
def dfs(self,start,s,wordDict,dp,temp):
if start>len(s)-1:
self.res.append(temp.strip())
return
for i in range(start,len(s)):
if dp[i] and s[start:i+1] in wordDict:
curr=temp
temp+=s[start:i+1]+' '
self.dfs(i+1,s,wordDict,dp,temp)
# 回溯 还原 str
temp=curr
法三:记忆化搜索