【代码随想录训练营】【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)
相关推荐
艾莉丝努力练剑33 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟2 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀2 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1122 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧2 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
myzzb3 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
旺小仔.4 小时前
双指针和codetop复习
数据结构·c++·算法
jingfeng5144 小时前
C++ STL-string类底层实现
前端·c++·算法
雲墨款哥5 小时前
JS算法练习-Day10-判断单调数列
前端·javascript·算法
FPGA5 小时前
CRC校验原理及其FPGA实现
算法