题目:
难度: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];
};
扩展阅读: