leetcode 139

一道动态规划题目

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

  • 拆分时可以重复使用字典中的单词。
  • 你可以假设字典中没有重复的单词。

链接

自己算法比较渣…看到这个题目的时候一开始没想到动态规划的思路,就用传统方法做。。结果gg了。后来上厕所的时候突然想通了2333

这里我们设定一个长度为字符串长度的状态记录数组state,state[i]表示字符串从0到i是可以被正确切割的。而求state[i]为true的条件是,state[jj]能被切割,并且s[j]到s[j]这子字符串在字典中。于是代码思路就比较简单了

// 动态规划
// state[i]表示s[0]到s[i]都能被切割成功
var wordBreak = function (s, wordDict) {
    if (s.length === 0) {
        return false
    }
    const dir = new Map();
    for (let v of wordDict) {
        dir.set(v, 1);
    }
    const state = new Array(s.length + 1).fill(false);
    state[0] = true;
    for (let i = 1; i <= s.length; i++) {
        for (let j = i - 1; j >= 0; j--) {
         // state[i]为true是state[j]为true且s[j]到s[i]都为true
            if (state[j] && dir.get(s.slice(j, i))) {
                state[i] = true;
                break;
            }
        }
    }
    return state[s.length]
};

动态规划有时候真的不太好想出来。基础的动态规划题目还是要多加练习才行

点赞