day51 动态规划part8 代码随想录算法训练营 139. 单词拆分

题目:139. 单词拆分

我的感悟:

  • 背包最后一part,不错!!
  • 这题不好,不写了。

理解难点:

  • 状态转移方程如何写

听课笔记:

首次代码及思考过程:

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        # 可以用多次-->完全背包
        # 物品是worDict集合
        # 背包是s(目标)
        # 如果初始化?递推公式是什么?
        # dp[j] += dp

看了别人的题解,比卡尔给的简洁

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

作者:吴彦祖
链接:https://leetcode.cn/problems/word-break/solutions/50986/dong-tai-gui-hua-ji-yi-hua-hui-su-zhu-xing-jie-shi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

通过截图:

  •  自己没写,下回吧

扩展写法-回溯记忆化搜索:

import functools

class Solution:
    def __init__(self):
        self.wordSet = None

    @functools.lru_cache(None)# 改成这个更轻量级@functools.cache
    def backtracking(self, s: str, startIndex: int) -> bool:
        if startIndex >= len(s):
            return True

        for i in range(startIndex, len(s)):
            word = s[startIndex:i + 1]
            if word in self.wordSet and self.backtracking(s, i + 1):
                return True

        return False

    def wordBreak(self, s: str, wordDict: list[str]) -> bool:
        self.wordSet = set(wordDict)  # 将单词集合设置为实例变量
        return self.backtracking(s, 0)

资料:

139.单词拆分 

视频讲解:https://www.bilibili.com/video/BV1pd4y147Rh

https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html

posted @ 2024-03-01 17:58  o蹲蹲o  阅读(3)  评论(0编辑  收藏  举报