Word Break
https://leetcode.com/problems/word-break/
本以为是一道dfs的递归题目,但是超时。对于下面的case,会超时
“aaaaaaaa”
[“aaaa”,”aa”,”a”]
递归程序
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: Set[str]
:rtype: bool
"""
if not s: return True
for i in xrange(len(s) + 1):
if s[:i] in wordDict:
if i == len(s): return True
#print i
j = i + 1
while (s[:j] in wordDict):
j += 1
#print j
return self.wordBreak(s[j - 1:], wordDict)
return False
实际上要用dp。最后求bool型变量的也可以用dp,
参考http://www.cnblogs.com/zuoyuan/p/3760660.html
class Solution:
# @param s, a string
# @param dict, a set of string
# @return a boolean
# @good coding!
def wordBreak(self, s, dict):
dp = [False for i in range(len(s)+1)]
dp[0] = True#这里要注意给dp[0]初始化为True,比如s就一个word,刚好就在dict中。
for i in range(1, len(s)+1):
for k in range(i):
if dp[k] and s[k:i] in dict:
dp[i] = True
return dp[len(s)]
Word Break II
https://leetcode.com/problems/word-break-ii/
思路就是上一题的dp结合dfs
参考:
http://www.cnblogs.com/zuoyuan/p/3760804.html
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:#这里的子节点就是递增的prefix string
self.dfs(s[i:], dict, stringlist+' '+s[:i])
def wordBreak(self, s, dict):
Solution.res = []
self.dfs(s, dict, '')
return Solution.res