[LeetCode]140. 单词拆分 II (java实现)爆搜dfs + dp剪枝
1. 题目
2. 读题(需要重点注意的东西)
思路(爆搜dfs+剪枝):
爆搜dfs: 爆搜出所有的方案,并进行剪枝
剪枝: 预处理 f[ ]数组 ,用[LeetCode]139. 单词拆分(java实现)动态规划判断第 i 个位置到最后一个位置这之间的字符串是不是合法的方案,将其记录在 f[i] 中
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
List<String> res = new ArrayList<>();
String path = "";
boolean[] f;
Set<String> set = new HashSet<>();
int n;
public List<String> wordBreak(String s, List<String> wordDict) {
n = s.length();
f = new boolean[n+1];
for(var word : wordDict) set.add(word);
f[0] = true;
s = " " + s;
// 预处理 f 数组
for(int i = 1; i <= n ;i++){
for(int j = 1; j <= i;j++){
String temp = s.substring(j,i+1);
if(set.contains(temp)) f[i] |= f[j-1];
}
}
if(!f[n]) return res;
// dfs爆搜每一个字符
dfs(s,1,"");
return res;
}
public void dfs(String s,int u,String path){
if(u == n + 1){
res.add(path);
return;
}
for(int i = u;i <= n;i ++){
String temp = s.substring(u,i+1);
if(f[i] && set.contains(temp)){
// 让系统栈保留next,从而不需要回溯
String next = path.length() == 0 ? temp : path + " " + temp ;
dfs(s,i+1,next);
}
}
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 动态规划
- dfs