public class Solution {
public
ArrayList<String> wordBreak(String s, Set<String> dict) {
ArrayList<String> result = new
ArrayList<String>();
if(s == null
|| dict.size() == 0)
return
result;
int
len = s.length();
boolean[][] splits = new
boolean[len][len + 1];
for(int
i = len - 1; i >= 0; --i){
splits[i][i] = false;
for(int
j = i + 1; j < len + 1; ++j){
if(dict.contains(s.substring(i, j)))
splits[i][j] = true;
else{
for(int
k = i; k < j; ++k){
splits[i][j] = splits[i][k] && splits[k][j];
if(splits[i][j])
break;
}
}
}
}
if(splits[0][len]){
ArrayList<ArrayList<Integer>> resultInPosition = new
ArrayList<ArrayList<Integer>>();
HashMap<Integer, ArrayList<ArrayList<Integer>> > finished = new
HashMap<Integer,ArrayList<ArrayList<Integer>> >();
for(int
i = len - 1; i >= 0; --i){
ArrayList<ArrayList<Integer>> startAti = new
ArrayList<ArrayList<Integer>>();
if(splits[i][len]){
if(dict.contains(s.substring(i, len))){
ArrayList<Integer> aList = new
ArrayList<Integer>();
aList.add(len);
startAti.add(aList);
}
for(int
j = i + 1; j < len; ++j){
if(dict.contains(s.substring(i,j)) && splits[j][len]){
ArrayList<ArrayList<Integer> > fin = finished.get(j);
for(ArrayList<Integer> ls : fin){
ArrayList<Integer> temp = new
ArrayList<Integer>();
temp.add(j);
temp.addAll(ls);
startAti.add(temp);
}
}
}
}
finished.put(i, startAti);
}
resultInPosition = finished.get(0);
for(ArrayList<Integer> ls : resultInPosition){
int
lssize = ls.size();
int
first = ls.get(0);
String resultString = s.substring(0, first);
for(int
i = 1; i < lssize; ++i){
resultString += (" "+ s.substring(first, ls.get(i)));
first = ls.get(i);
}
result.add(resultString);
}
}
return
result;
}
}