leetcode 139. 单词拆分
题目描述
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
举例:
输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。
题目分析
- 看到题目后首先一个naive的想法就是遍历求解,针对每一个可能空格出现的位置进行递归,看是否满足题目要求的拆分标准,例如以下代码
def wordBreak(s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
if not s:
return
elif s in wordDict:
return True
res = [False]
def recur_find(string):
if res[0] is True:
return
if not string:
res[0] = True
for i in range(1, len(string)+1):
if string[:i] in wordDict:
recur_find(string[i:])
recur_find(s)
return res[0]
- 然而遍历求解没有考虑到例如“aaaaaaaaabcaaaaa", [“a”,“aa”]这样的重复字符问题,要注意想取巧是很难做到的,所以就考虑使用动态规划来解决。涉及一个matrix,matrix 纬度为[len(string),len(string)], matrix[i][j]表示string的第i个字符到第j个字符的子字符串在字典中,注意我们最终的答案是在matrix[0][-1]这里,所以在迭代计算matrix[i][j]时要更新matrix[0][i]的结果
最终代码
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
matrix = [[0 for _ in xrange(len(s))] for _ in xrange(len(s))]
for i in xrange(len(matrix)):
for j in xrange(i,len(matrix)):
if s[i:j+1] in wordDict:
matrix[i][j] = 1
if matrix[0][i-1] == 1 and i > 0:
matrix[0][j] = 1
return True if matrix[0][-1] == 1 else False
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。