LongDz 的数字文墨提案

139. 单词拆分

2 min

题目

139. 单词拆分 中等

解法:动态规划

思路

核心思想是动态规划,定义 dp[i] 表示前 i 个字符能否被拼接。

正确性基于最优子结构:若 s[0

] 可被拼接,则必存在分割点 j,使得 s[0
] 可被拼接且 s[j
] 是字典单词;反之亦然。这保证了状态转移的完备性。

  • Step 1: 构建哈希集合存储字典,实现 O(1) 查找
  • Step 2: 初始化 dp[0] = true,表示空字符串可拼接
  • Step 3: 遍历每个位置 i,尝试所有分割点 j
  • Step 4: 若 dp[j] 为 true 且子串 s[j
    ] 在字典中,则设置 dp[i] = true
  • Step 5: 返回 dp[n] 作为最终结果

复杂度

  • 时间复杂度: O(n2)O(n^2)
  • 空间复杂度: O(n+m)O(n + m)

代码

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {

        unordered_set<string> dict(wordDict.begin(), wordDict.end());

        int n = s.size();
        vector<bool> 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];
    }
};