leetcode 139. 单词拆分

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-break

给你一个字符串 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

分析

哈希表+回溯

第一反应就是回溯,但...
会超时,除非在python中使用缓存装饰器,可以通过用力,但是在java没有这么强大的外挂。
特殊用例超时的java代码:

class Solution {
    public static boolean wordBreak(String s, List<String> wordDict) {
        Set<String> set= new HashSet<>();
        for(String str:wordDict){
            set.add(str);
        }
        return traceback(s, set);
    }

    public static boolean traceback(String s, Set<String> set){
        if(set.contains(s)){
            return true;
        }
        for(int i=1;i<s.length();i++){
            if(set.contains(s.substring(0,i))){
                if(traceback(s.substring(i), set)){
                    return true;
                }
            }
        }
        return false;
    }
}

再贴一个用缓存装饰器能够跑通的python3代码

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        import functools
        @functools.lru_cache(None)
        def back_track(s):
            if(not s):
                return True
            res=False
            for i in range(1,len(s)+1):
                if(s[:i] in wordDict):
                    res=back_track(s[i:])
            return res
        return back_track(s)
posted @ 2022-02-08 18:26  PaB式乌龙茶  阅读(40)  评论(0编辑  收藏  举报