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)