原文:139. 单词拆分(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0139/

题目:

难度:Middle

相关话题:动态规划

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

说明:

  • 拆分时可以重复使用字典中的单词。

  • 你可以假设字典中没有重复的单词。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
    注意你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {string} s
 * @param {string[]} wordDict
 * @return {boolean}
 */
var wordBreak = function(s, wordDict) {
  // let hash={}
  // for(let i=0;i<wordDict.length;i++){
  //   hash[wordDict[i]]=true
  // }
  // let visited=[]
  // let find=false
  // function backtrack(start){
  //   if(start>=s.length)return find=true
  //   let cur=''
  //   for(let i=start;i<s.length;i++){
  //     if(visited[i])continue
  //     let w=cur+s.substring(start,i+1)
  //     if(hash[w]){
  //       visited[i]=true
  //       backtrack(i+1)
  //       if(find)return
  //     }
  //   }
  // }
  // backtrack(0)
  // return find

  // dp
  let dp=Array(s.length + 1).fill(false)

  dp[0] = true;
  for(let i=1; i <= s.length; i++){
    for(let j=0; j < i; j++){
      if(dp[j] && wordDict.includes(s.substring(j, i))){
        dp[i] = true;
        break;
      }
    }
  }

  return dp[s.length];
};

扩展阅读: