LeetCode: 140. 单词拆分 II
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101152911364.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzY1NTM1,size_16,color_FFFFFF,t_70#pic_center)
解法: 递归回溯
直接递归回溯会出问题, 在 aaaaaaaaaaaaabaaaaaaaaaaaaaa的情况下会出现大量的重复计算。造成超时
使用记忆化递归 >> 降低时间复杂度
用 map 或数组存储计算结果,数组索引为指针位置,值为子调用的结果。下次遇到相同的子问题时,直接返回 memo 中的缓存值,避免进入重复的递归
递归回溯
不知道怎么剪枝 >> 取巧了 >> 规避了 aaaaaaaaaaaaabaaaaaaaaaaa 这种样例 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101153411223.png#pic_center)
public List wordBreak(String s, List wordDict) {
if(s == null) return list;
String c = wordDict.toString();
for (int i = 0; i
if(left >= s.length()){
// 一种答案
list.add(ans.substring(0, ans.length() - 1));
return ;
}
for (int i = left; i
// 找到第一个相等的
ans.append(temp).append(" ");
dfs(s, "", i + 1, wd);
// 把当前单词删除
ans.delete(ans.length() - (temp.length() + 1), ans.length());
}
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101153055805.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101153133905.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzY1NTM1,size_16,color_FFFFFF,t_70#pic_center)
记忆化搜索降低时间复杂度 >> 官方的 Java 版题解没看懂 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101153740941.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101154218420.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101160706282.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzY1NTM1,size_16,color_FFFFFF,t_70#pic_center)
记忆化递归代码
优化
样例: “pineapplepenapple” Arrays.asList(“apple”, “pen”, “applepen”, “pine”, “pineapple”)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101171901234.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzY1NTM1,size_16,color_FFFFFF,t_70#pic_center)
public List wordBreak(String s, List wordDict) {
if(s == null) return new ArrayList();
return dfs(s, "", 0, wordDict);
}
Map map = new HashMap();
public List dfs(String s, String temp, int left, List wd){
if(map.containsKey(left)) return map.get(left);
if(left >= s.length()) return new ArrayList(){{add("");}};
List ret = new ArrayList();
for (int i = left; i
List last = dfs(s, "", i + 1, wd);
for (String str: last) {
ret.add(str.equals("")? temp : temp + " " + str);
}
}
}
map.put(left, ret);
return ret;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101171050466.png#pic_center)
>> 参考dl
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201101171138860.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNzY1NTM1,size_16,color_FFFFFF,t_70#pic_center)
|