classSolution{publicbooleanwordBreak(String s,List<String> wordDict){//如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。//所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。HashSet<String> set =newHashSet<>(wordDict);boolean[] valid =newboolean[s.length()+1];
valid[0]=true;for(int i =1; i <= s.length(); i++){// 遍历背包for(int j =0; j < i &&!valid[i]; j++){// 遍历物品if(set.contains(s.substring(j, i))&& valid[j]){
valid[i]=true;}}}return valid[s.length()];}}
// 回溯法+记忆化classSolution{privateSet<String> set;privateint[] memo;publicbooleanwordBreak(String s,List<String> wordDict){
memo =newint[s.length()];
set =newHashSet<>(wordDict);returnbacktracking(s,0);}publicbooleanbacktracking(String s,int startIndex){// System.out.println(startIndex);if(startIndex == s.length()){returntrue;}if(memo[startIndex]==-1){returnfalse;}for(int i = startIndex; i < s.length(); i++){String sub = s.substring(startIndex, i +1);// 拆分出来的单词无法匹配if(!set.contains(sub)){continue;}boolean res =backtracking(s, i +1);if(res)returntrue;}// 这里是关键,找遍了startIndex~s.length()也没能完全匹配,标记从startIndex开始不能找到
memo[startIndex]=-1;returnfalse;}}