【代码随想录训练营】【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 分钟前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡13 分钟前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin22 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码29 分钟前
Cmd命令大全(万字详细版)
python·算法·小程序
scan72444 分钟前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活1 小时前
理解支持向量机
算法·机器学习·支持向量机
大山同学1 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习
axxy20001 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
黑客Ash2 小时前
安全算法基础(一)
算法·安全
AI莫大猫2 小时前
(6)YOLOv4算法基本原理以及和YOLOv3 的差异
算法·yolo