139. 单词拆分 - 力扣(LeetCode)

代码

python 复制代码
# encoding = utf-8
# 开发者:Alen
# 开发时间: 20:18 
# "Stay hungry,stay foolish."

class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        dp = [False] * (len(s) + 1)
        dp[len(s)] = True

        for i in range(len(s)-1, -1, -1):
            for w in wordDict:
                if (i+len(w)) <= len(s) and s[i : i+len(w)] == w:
                    dp[i] = dp[i+len(w)]
                if dp[i]:
                    break

        return dp[0]

解析

核心定义

复制代码
dp[i] = True  表示 s[i:] (从位置 i 到末尾)可以被字典拆分

目标:求 dp[0],即整个字符串 s[0:] 是否可拆分。


逐行解析

1. 初始化

复制代码
dp = [False] * (len(s) + 1)
dp[len(s)] = True
```

创建长度为 `n+1` 的数组,全部初始化为 `False`。`dp[len(s)] = True` 是**边界条件**:空串(从末尾之后开始)认为可以拆分。

以 `s = "leetcode"` 为例(长度8):
```
索引:  0  1  2  3  4  5  6  7  8
dp:  [F, F, F, F, F, F, F, F, T]
                                 ↑ 空串,base case

2. 从右往左遍历

复制代码
for i in range(len(s) - 1, -1, -1):

ilen(s)-10,即从字符串末尾向开头逐个位置判断。

3. 尝试每个字典单词

复制代码
    for w in wordDict:
        if (i + len(w)) <= len(s) and s[i : i + len(w)] == w:
            dp[i] = dp[i + len(w)]

对于当前位置 i,尝试每个字典单词 w

  • i + len(w) <= len(s) :确保从位置 i 开始放这个词不会越界
  • s[i : i + len(w)] == w :检查从 i 开始的子串是否恰好等于 w
  • 如果匹配了,那 dp[i] = dp[i + len(w)],意思是:如果匹配了这个词,剩余部分 s[i+len(w):] 能不能拆分?

4. 提前退出

复制代码
        if dp[i]:
            break
```

只要找到一种能拆分的方案,就不用再试其他单词了。

---

## 用例子走一遍

`s = "leetcode"`, `wordDict = ["leet", "code"]`

从右往左填表:
```
i=7: s[7:]="e"
     尝试 "leet" → 7+4=11 > 8,越界
     尝试 "code" → 7+4=11 > 8,越界
     dp[7] = False

i=6: s[6:]="de"     → 都匹配不上 → dp[6] = False
i=5: s[5:]="ode"    → 都匹配不上 → dp[5] = False

i=4: s[4:]="code"
     尝试 "leet" → s[4:8]="code" ≠ "leet"
     尝试 "code" → s[4:8]="code" == "code" ✅
       dp[4] = dp[4+4] = dp[8] = True ✅
     break!
     dp[4] = True

i=3: s[3:]="tcode"  → 都匹配不上 → dp[3] = False
i=2: s[2:]="etcode" → 都匹配不上 → dp[2] = False
i=1: s[1:]="eetcode"→ 都匹配不上 → dp[1] = False

i=0: s[0:]="leetcode"
     尝试 "leet" → s[0:4]="leet" == "leet" ✅
       dp[0] = dp[0+4] = dp[4] = True ✅
     break!
     dp[0] = True

最终 return dp[0] = True

结果

解题步骤:https://www.bilibili.com/video/BV11nXvBgEMu/

相关推荐
墨韵流芳2 小时前
CCF-CSP第41次认证第一题——平衡数
c++·算法·ccf·平衡数
Book思议-2 小时前
【数据结构实战】栈的经典应用:后缀表达式求值 +中缀转后缀 ,原理 + 代码双通透
数据结构·算法··后缀表达式·后缀转中缀
炽烈小老头2 小时前
【 每天学习一点算法 2026/03/30】跳跃游戏
学习·算法
wuweijianlove2 小时前
算法性能预测的统计模型与参数敏感性分析的技术6
算法
Just right2 小时前
重学算法 数组 LC27移除元素
数据结构·算法
郝学胜-神的一滴2 小时前
巧解括号序列分解问题:栈思想的轻量实现
开发语言·数据结构·c++·算法·面试
计算机安禾3 小时前
【数据结构与算法】第15篇:队列(二):链式队列的实现与应用
c语言·开发语言·数据结构·c++·学习·算法·visual studio
算法鑫探3 小时前
C语言密码验证:3次机会解锁
c语言·数据结构·算法·新人首发
穿条秋裤到处跑3 小时前
每日一道leetcode(2026.03.30):判断通过操作能否让字符串相等 II
算法·leetcode