题目: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 题目链接
我的JavaScript解法
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
// 备忘录,-1 代表未计算,0 代表 false,1 代表 true
let memo = new Array(s.length).fill(-1);
return dp(s, 0, wordDict, memo);
};
const dp = (s, i, wordDict, memo) => {
// base case,整个 s 都被拼出来了
if (i == s.length) return true;
// 防止冗余计算
if (memo[i] != -1) return memo[i] == 1 ? true : false;
// 遍历所有单词,尝试匹配 s[i..] 的前缀
for (let word of wordDict) {
let len = word.length;
if (i + len > s.length) continue;
let subStr = s.substring(i, i + len);
if (subStr != word) continue;
// s[i..] 的前缀被匹配,去尝试匹配 s[i+len..]
if (dp(s, i + len, wordDict, memo)) {
memo[i] = 1;
return true;
}
}
memo[i] = 0;
return false;
}
解析: 动态规划解题