🧩Algo 动态规划

139. 单词拆分

难度:🟡 Medium | 标签:动归、字符串 | 状态:⬜ LeetCode 链接

思路

dp[i] 表示 s[0..i) 能否被拆分。 转移:枚举切点 j,若 dp[j] && s[j..i) ∈ wordDictdp[i] = true

代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> dict(wordDict.begin(), wordDict.end());
        int n = s.size();
        vector<char> dp(n + 1, false);
        dp[0] = true;
        for (int i = 1; i <= n; ++i) {
            for (int j = 0; j < i; ++j) {
                if (dp[j] && dict.count(s.substr(j, i - j))) {
                    dp[i] = true; break;
                }
            }
        }
        return dp[n];
    }
};

复杂度

  • 时间 O(n² · L),L 平均单词长度
  • 空间 O(n)

易错 / 回顾

  • dp[0] = true(空串可拆)
  • 优化:枚举 j 从 max(0, i - maxLen) 起,限制 substr 长度
  • 140(输出所有拆分):DFS + 记忆化
Related · 动态规划