这道题乍看之下很简单,依旧是回溯法,但是实际运行时回溯法的复杂度为,所以我们要进行一些改变。
我们观察到在运行时我们要反复检查一些子串是否可拆分,这些查询中有一大部分是重复的,所以我们可以建立一个查询缓存,让查过的子串不必重复查询:
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
import functools
@functools.lru_cache(None)
def back(s):
if len(s) == 0:
return True
res = False
for i in range(1,len(s)+1):
if s[0:i] in wordDict:
res = back(s[i:]) or res
return res
return back(s)
还有就是对于新的函数缓存装饰器的学习 。
动态规划解法:
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
query = [False]*(len(s)+1)
query[0] = True
for i in range(0,len(s)):
for j in range(i+1,len(s)+1):
if query[i] and (s[i:j] in wordDict):
query[j] = True
return query[-1]