动态规划法
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
# 基本逻辑:不断站在新的台阶上进行搭台阶
# dp[i]:当前位置i是否可以作为新的一个单词的起点
# if dp[i] == True && dp[i:i+n] 属于字典中 then dp[i+n] = True
# 字符串的长度
n = len(s)
# 最长的单词长度
max_l = max([len(word) for word in wordDict])
# 初始化动态规划数组(台阶)
dp = [False] * (n + 1)
dp[0] = True
for i in range(n):
# 遍历以i为开头所能匹配的所有单词
for j in range(i+1, n+1):
if dp[i] and s[i:j] in wordDict:
if j - i > max_l:
break
dp[j] = True
if j == n:
return True
return False
记忆化搜索法(小黑举一反三)
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
@functools.lru_cache()
def dfs(rest_s):
if not rest_s:
return True
for word in wordDict:
if rest_s[:len(word)] == word:
res = dfs(rest_s[len(word):])
if res:
return res
return False
return dfs(s)
小黑生活
晚餐吉野家日料小火锅
晚上继续练小汤2
早餐麦当劳 通勤英语 跑步