139 单词拆分
首先想到这是一道可以用dfs解决的题目,但是dfs会超时,时间复杂度极高。
如果题目没有要求给出具体的路径,能用dfs解决的题目一般都可以用dp解决。
只是这个题目的子问题有点奇怪,因此没有考虑好。
子问题:以s[i]
结尾的字符串是否满足题意
状态:dp[i]
对应每个子问题
状态转移: dp[i] = dp[x] and s[x:i] in dic
也就是说,前一段满足状态,且后一段整体在。其中x需要被遍历,因为我们将x看为了一个整体。
初状态:dp[0]=True
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
dp = [False for i in range(len(s)+1)]
dp[0] = True
wordDict = set(wordDict)
for i in range(0,len(s)):
for j in range(i+1,len(s)+1):
if dp[i] and (s[i:j] in wordDict):
dp[j] = True
if dp[len(s)]:
return True
return False
代码反思:
这个类型的dp问题还是做的不够多,对于子问题的设计没有感觉。
这里是将前i个字符串作为一个整体,后一段作为一个整体分析。还是很巧妙的。
整体的时间复杂度:
O
(
N
2
)
O(N^2)
O(N2)