题目:https://oj.leetcode.com/problems/word-break-ii/
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
算法分析:动态规划。时间复杂度O(n^2),空间复杂度O(n^2)
public class Solution {
public List<String> wordBreak(String s, Set<String> dict) {
boolean[] f=new boolean[s.length()+1];
//b[i][j] 为true,表示s[j, i) 是一个合法单词,可以从j 处切开
boolean[][] b=new boolean[s.length()+1][s.length()];
f[0]=true;
for(int i=1;i<=s.length();i++) {
for(int j=i-1;j>=0;j--) {
if(f[j]&&dict.contains(s.substring(j,i))) {
f[i]=true;
b[i][j]=true;
}
}
}
List<String> results=new ArrayList<String>();
Stack<String> path=new Stack<String>();
genPath(s,b,s.length(),path,results);
return results;
}
//DFS 遍历树,生成路径
private void genPath(String s,boolean[][] b,int current,Stack<String> path,List<String> results){
if(current==0) {
Stack<String> temp=(Stack<String>)(path.clone());
String str="";
if(!temp.isEmpty()) {
str+=temp.pop();
}
while(!temp.isEmpty()) {
str+=" "+temp.pop();
}
results.add(str);
return;
}
for(int i=0;i<current;i++) {
if(b[current][i]) {
path.add(s.substring(i,current));
genPath(s,b,i,path,results);
path.pop();
}
}
}
}