leetcode第139题单词拆分

81 阅读1分钟

题目: 给你一个字符串 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;
}

解析: 动态规划解题