主要的思想是 DP + DFS:动态规划法和深度优先法
先用动态规划法判断是否成功划分;再用深度优先算法来确定划分情况。
public List<String> wordBreak(String s, List<String> wordDict) {
List<String> res = new ArrayList<String>();
//dp 判断能否拆分
boolean[] dp = new boolean[s.length()+1];
dp[0] = true;
for(int i=0 ;i<=s.length();i++){
for(int j=0;j<i;j++){
if(dp[j] && wordDict.contains(s.substring(j,i))){
dp[i]=true;
break;
}
}
}
if(!dp[s.length()]){
return res;
}
StringBuilder sb = new StringBuilder();
dfs(s,wordDict,sb,res,0);
return res;
}
private void dfs(String s,List<String> wordDict,StringBuilder sb,List<String> res,int start){
if(start == s.length()){
res.add(sb.toString().trim());
return;
}
for(int i=start+1;i<=s.length();i++){
String str = s.substring(start,i);
if(wordDict.contains(str)){
int length = sb.length();
sb.append(str).append(" ");
dfs(s,wordDict,sb,res,i);
sb.setLength(length);
}
}
}