一道动态规划题目
给定一个非空字符串 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]
};
动态规划有时候真的不太好想出来。基础的动态规划题目还是要多加练习才行