【代码随想录训练营】【Day 49】【动态规划-8】| Leetcode 139

【代码随想录训练营】【Day 49】【动态规划-8】| Leetcode 139

需强化知识点

题目

139. 单词拆分

  • 注意 要保证 单词构成的有序性,先遍历背包,再遍历物品
  • 回溯法
python 复制代码
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        # 0-i 的 单词能否由 字典构成
        dp = [False] * (len(s) + 1)
        dp[0] = True

        # 先遍历背包,再遍历物品
        for i in range(1, len(s) + 1):
            for word in wordDict:
                if i >= len(word) and word == s[i-len(word):i]:
                    dp[i] = dp[i] or dp[i-len(word)]
        
        return dp[len(s)]
    
  • 感受 backtracking 返回布尔值
python 复制代码
class Solution:
    def backtracking(self, s: str, wordSet: set[str], startIndex: int) -> bool:
        # 边界情况:已经遍历到字符串末尾,返回True
        if startIndex >= len(s):
            return True

        # 遍历所有可能的拆分位置
        for i in range(startIndex, len(s)):
            word = s[startIndex:i + 1]  # 截取子串
            if word in wordSet and self.backtracking(s, wordSet, i + 1):
                # 如果截取的子串在字典中,并且后续部分也可以被拆分成单词,返回True
                return True

        # 无法进行有效拆分,返回False
        return False

    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        wordSet = set(wordDict)  # 转换为哈希集合,提高查找效率
        return self.backtracking(s, wordSet, 0)
相关推荐
子春一5 分钟前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏
人道领域31 分钟前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
TracyCoder1231 小时前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
A尘埃1 小时前
电信运营商用户分群与精准运营(K-Means聚类)
算法·kmeans·聚类
power 雀儿2 小时前
掩码(Mask)机制 结合 多头自注意力函数
算法
会叫的恐龙2 小时前
C++ 核心知识点汇总(第六日)(字符串)
c++·算法·字符串
小糯米6012 小时前
C++顺序表和vector
开发语言·c++·算法
We་ct2 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
Lionel6892 小时前
分步实现 Flutter 鸿蒙轮播图核心功能(搜索框 + 指示灯)
算法·图搜索算法
小妖6663 小时前
js 实现快速排序算法
数据结构·算法·排序算法