第18题 力扣LeetCode 热题 HOT 100(39. 单词拆分)

第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)

所以我们应该怎么去解这一题

  1. 遍历字符串,字符串当前位置的的一个词如果与字典中的词一样,字符串简短,从下个位置继续匹配,如catsandog 匹配到cats 是一样的则,andog进入下一个阶段的匹配,递归调用函数
  2. 如果1中的不行,如cats不行,则继续尝试cat 能不能走通。
  3. 匹配到最后,cats不行,cat这条路也不行,则证明当前字符串无法完整匹配。则返回false
  4. 其它情况,如果有某一条路行的通,因为字符串是不断减短的,如果字符串长度为0,则说明能完全匹配
  5. 优化,因为当前路径不匹配,以后某条路以这个点为路径,则一定也不行 如 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)

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值