原题地址:https://oj.leetcode.com/problems/word-break-ii/
题意:
Given a string s and a dictionary of
words dict, add spaces in s to construct a
sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example,
given
s = "catsanddog"
,
dict = ["cat",
.
"cats", "and", "sand", "dog"]
A solution is ["cats and dog", "cat sand dog"]
.
解题思路:这道题不只像word
break那样判断是否可以分割,而且要找到所有的分割方式,那么我们就要考虑dfs了。不过直接用dfs解题是不行的,为什么?因为决策树太大,如果全部遍历一遍,时间复杂度太高,无法通过oj。那么我们需要剪枝,如何来剪枝呢?使用word
break题中的动态规划的结果,在dfs之前,先判定字符串是否可以被分割,如果不能被分割,直接跳过这一枝。实际上这道题是dp+dfs。
代码:
class Solution:
# @param s, a string
# @param dict, a set of string
# @return a list of strings
def check(self, s, dict):
dp = [False for i in range(len(s)+1)]
dp[0] = True
for i in range(1, len(s)+1):
for k in range(0, i):
if dp[k] and s[k:i] in dict:
dp[i] = True
return dp[len(s)]def dfs(self, s, dict, stringlist):
if self.check(s, dict):
if len(s) == 0: Solution.res.append(stringlist[1:])
for i in range(1, len(s)+1):
if s[:i] in dict:
self.dfs(s[i:], dict, stringlist+‘ ‘+s[:i])def wordBreak(self, s, dict):
Solution.res = []
self.dfs(s, dict, ‘‘)
return Solution.res
[leetcode]Word Break II @ Python