package com.wsq.huishuo;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class WordBreak {
public List<String> wordBreak(String s, List<String> wordDict) {
List<String> ans = new LinkedList();
Map<Integer, List<List<String>>> map = new HashMap();
List<List<String>> breakList = backTrack(s, s.length(), new HashSet<String>(wordDict), 0, map);
for(List<String> list: breakList){
ans.add(String.join(" ", list));
}
return ans;
}
private List<List<String>> backTrack(String s, int length, Set<String> wordSet, int index, Map<Integer, List<List<String>>> map){
if(!map.containsKey(index)){
List<List<String>> wordBreaks = new LinkedList();
if(index == length){
wordBreaks.add(new LinkedList());
}
for(int i = index + 1; i <= length; i++){
String word = s.substring(index, i);
if(wordSet.contains(word)){
List<List<String>> subBeaks = backTrack(s, length, wordSet, i, map);
for(List<String> list: subBeaks){
LinkedList<String> wordBreak = new LinkedList<String>(list);
wordBreak.offerFirst(word);
wordBreaks.add(wordBreak);
}
}
}
map.put(index, wordBreaks);
}
return map.get(index);
}
}