第18题 力扣LeetCode 热题 HOT 100(39. 单词拆分)
给定一个非空字符串 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
题解
看了好几遍才理解题意,本题的意思是,一个字符串,只能通过字典中的词来进行匹配,要求一个字符串,可以通过空格分开,分开后的词在字典中。字典中的词可以重复出现。
如 s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”], 这个结果是false, 因为cats and og,或者 cat sand og 还有其它等用空格分开字符串的方式,最后的词不能完全匹配,所以结果为false, 如果 wordDict 中有一个og 这一题的返回结果为true(或其他如cats an dog中的an)
所以我们应该怎么去解这一题
- 遍历字符串,字符串当前位置的的一个词如果与字典中的词一样,字符串简短,从下个位置继续匹配,如catsandog 匹配到cats 是一样的则,andog进入下一个阶段的匹配,递归调用函数
- 如果1中的不行,如cats不行,则继续尝试cat 能不能走通。
- 匹配到最后,cats不行,cat这条路也不行,则证明当前字符串无法完整匹配。则返回false
- 其它情况,如果有某一条路行的通,因为字符串是不断减短的,如果字符串长度为0,则说明能完全匹配
- 优化,因为当前路径不匹配,以后某条路以这个点为路径,则一定也不行 如 aaaaaab 字典集 a aa aaa, 如果 先匹配a ,发现aaaaab,aaaab,aaab,aab,ab,b,都是行不通的,所以后面匹配aa,即aaaab,也是行不通的。
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
let obj = {};
let find = function(s,wordDict){
if(s.length ==0 ) {
return true;
}
if(obj[s]===false) return false;
let bool;
for(let i =0; i< wordDict.length; i++){
let len = wordDict[i].length;
if(len> s.length) continue;
if(s.slice(0, len) == wordDict[i]){
bool = find(s.slice(len), wordDict);
if(bool==true) return true;
}
}
obj[s] = false;
return false;
}
return find(s, wordDict)
};