您的位置:首页 > 其它

leetcode -- Word Break I & II -- 重点

2015-12-18 09:53 405 查看

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,

参考/article/4981569.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

参考:

/article/4981570.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: