【前端er每日算法】动态规划--139单词拆分

65 阅读1分钟

题目一 139. 单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

思路

如果要转化为背包问题,字符串s就是背包,单词是否能组成s,就是物品是否能把背包装满。

  1. dp[i]: 字符串长度为i的话,为true,表示可以拆分为一个或多个在字典中出现的单词。
  2. 递归公式:dp[j] = true, 且[j, i]这个区间的子串出现在字典里,则dp[i]是true
  3. 初始化 dp[0] = true, 其他事false
  4. 遍历顺序,拆分为1个或多个,完全背包
var wordBreak = function(s, wordDict) {
    const dp = Array(s.length + 1).fill(false);
    dp[0] = true;
    const len = s.length;
    for (let i = 0; i <= len; i++) {
        for (let j = 0; j < wordDict.length; j++) {
            if (i >= wordDict[j].length) {
                if (s.slice(i - wordDict[j].length, i) === wordDict[j] && dp[i - wordDict[j].length]) {
                    dp[i] = true;
                }
            }
        }
    }
    return dp[len];
};