139. 单词拆分

Medium

思路

这道之前已经提交过一次,但是现在碰到,又是没啥印象,要重新分析。这也是我做刷题笔记的理由之一:加深记忆、方便review

分析题目:

显然是有问题的

case: s="catsdog" words=["cat","cats","dog"] 当遍历到cat删除之后,剩余部分为sdog,无法匹配任何单词

尝试写一下代码,TLE!

超时用例:

"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab"
["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]

可以发现存在大量的重复计算(匹配完”a”、“aa”和匹配完”aaa”,后面剩下的字符串都是一样的)

优化,加入记忆化,AC!

代码

python3

import functools
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool: 
      @functools.lru_cache(None)
      def dfs(s):
        if s == "":
          return True
        r = False
        for w in wordDict:
          if s.startswith(w):
            r = r or dfs(s.replace(w,'',1))
        return r
      return dfs(s)

新思路

本题放在了,动态规划的类别当中。这种题一般递归方法是比较容易看出来的,递归中重复计算很多的情况,我们可以使用记忆化递归方式来优化

尝试使用动态规划写一下代码,AC!

代码

python3

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool: 
      dp = [False for _ in range(len(s)+1)]
      dp[0] = True
      for i in range(len(s)+1):
        for j in range(0, i):
          w = s[j:i]
          if (dp[j] and (w in wordDict)):
            dp[i] = True
      return dp[-1]