单词分割II
140. Word Break II Hard
Description
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences.
- Note:
The same word in the dictionary may be reused multiple times in the segmentation.
You may assume the dictionary does not contain duplicate words.
Example
- Example 1:
Input:
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
Output:
[
"cats and dog",
"cat sand dog"
]
- Example 2:
Input:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
Output:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
Explanation: Note that you are allowed to reuse a dictionary word.
- Example 3:
Input:
s = "catsandog"
wordDict = ["cats", "dog", "sand", "and", "cat"]
Output:
[]
题意
求非空字符串s的单词分割的所有可能结果。
解题思路
这题在139. Word Break词语分割的基础上求所有可能结果。一般求最优用动态规划,求所有可能值用回溯,也即递归。这题常规递归时间复杂度极大超时,所以采用了字典记录已分割单词的方式能求得结果。
code
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: List[str]
"""
memo = dict()
return self.dfs(s, wordDict,memo)
def dfs(self, s, wordDict, memo):
if not s:
return []
if s in memo:
return memo[s]
res = []
if s in wordDict:
res.append(s)
for i in range(1,len(s)):
if s[:i] in wordDict:
for j in self.dfs(s[i:],wordDict,memo):
res.append(s[:i] + " " + j)
memo[s] = res
return res