方法1: brute force using recurison and backtracking。这个方法会tle。
方法2: 方法1的优化,加上memoization技术。时间复杂n^3,空间复杂n。n为s的长度。
class Solution {
Map<String, Boolean> map = new HashMap<>();
public boolean wordBreak(String s, List<String> wordDict) {
if(map.containsKey(s)) return map.get(s);
if(wordDict.contains(s)){
map.put(s, true);
return true;
}
for(int i = 0; i < s.length(); i++){
String subString = s.substring(0, i+1);
if(wordDict.contains(subString)){
if(wordBreak(s.substring(i+1, s.length()), wordDict)) return true;
}
}
map.put(s, false);
return false;
}
}
方法3: dp。详细解释请直接看lc官方解答4。时间复杂n^3,空间复杂n。
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for(int i = 1; i < dp.length; i++){
for(int j = 0; j < i; j++){
if(dp[j] && wordDict.contains(s.substring(j,i))){
dp[i] = true;
break;
}
}
}
return dp[dp.length - 1];
}
}
总结:
- 也是一道比较经典的backtracking题目