【leetcode】139. 单词拆分

82 阅读1分钟

leetcode-139.png

这个问题可以用 动态规划 来解决。我们定义一个布尔数组 dp,其中 dp[i] 表示字符串前 i 个字符是否可以用字典中的单词拆分。

  • 初始化:dp[0] = true,因为空字符串可以被认为是可以拆分的。
  • 状态转移方程:对于每个位置 i,我们检查从 0 到 i 的子字符串,如果某个子串 s[j:i] 在字典中且 dp[j]为 true,则 dp[i] = true
var wordBreak = function(s, wordDict) {
    // 将 wordDict 转为 Set,便于查找
    let wordSet = new Set(wordDict);
    // 创建 dp 数组,长度为 s.length + 1,初始化为 false
    let dp = new Array(s.length + 1).fill(false);
    dp[0] = true; // 空字符串可以拆分

    // 遍历字符串的每一个位置 i
    for (let i = 1; i <= s.length; i++) {
        // 对于每一个位置 i,遍历之前的所有位置 j
        for (let j = 0; j < i; j++) {
            // 如果 dp[j] 为 true 且 s[j:i] 在字典中,dp[i] 为 true
            if (dp[j] && wordSet.has(s.slice(j, i))) {
                dp[i] = true;
                break; // 只要找到一种方式拆分就行
            }
        }
    }

    // 返回 dp[s.length],即整个字符串是否可以拆分
    return dp[s.length];
};