代码随想录算法训练营第四十六天|139.单词拆分

139.单词拆分

https://leetcode.com/problems/word-break/description/

思路:判断一个字符串是否能由列表中的子字符串组成, 列表中的元素可以复用, 那么可以把这类问题转化成完全背包问题。 用 dp 数组的i+1记录到字符串的下标 i 是是否可以组成。 dp[0] 要初始化成 1. 然后考虑到这个问题是排列问题, 例如 字符串'leetcode' 列表['code', 'leet']. 所以应该先循环背包容量再循环数组。 如果 str[i-len(substr) :i] == substr, 并且 dp[i-len(substr)] 都是true 的时候, dp[i] = True. 或者 如果原本 dp[i] = True了, 就不要再往下循环数组了 (表示已经fit了)。

难点:递归的逻辑比较难想, 要考虑原本dp[i] = True 的情况

python 复制代码
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [0 for _ in range(len(s)+1)]
        dp[0] = 1
        words = [(word, len(word)) for word in wordDict]
        for i in range(1, len(dp)):
            for word, l in words:
                if i < l: continue
                dp[i] = int(word == s[i-l:i]) * dp[i-l]
                if dp[i] == 1: break
        return bool(dp[-1])
        
相关推荐
2401_900151543 分钟前
代码覆盖率工具实战
开发语言·c++·算法
进击的小头5 分钟前
第8篇:PI控制器设计实战演练
c语言·python·mcu·算法
乌萨奇也要立志学C++7 分钟前
【洛谷】图论 图论最短路算法全解:从单源 Dijkstra 到多源 Floyd 模板与实战
算法·图论
AI科技星12 分钟前
基于v=c空间本底光速螺旋运动的宏观力方向第一性原理推导:太阳系与地球系统的全维度观测验证
人工智能·线性代数·算法·机器学习·平面
Epiphany.55614 分钟前
炸雷!(地址映射+dfs搜索)
算法
Crazyong16 分钟前
FreeRTOS-互斥量-2
算法
啊我不会诶24 分钟前
2025 北京市大学生程序设计竞赛暨“小米杯”全国邀请赛
c++·学习·算法
mit6.82427 分钟前
懒更新|单点查询
算法
Yupureki40 分钟前
《C++实战项目-高并发内存池》8. 最终性能优化与测试
c语言·开发语言·数据结构·c++·算法·性能优化
DeepModel1 小时前
【概率分布】均匀分布的原理、推导与Python实现
python·算法·概率论