[Leetcode] Word Break II
此题和另外word ladder II 有异曲同工之妙,最终路径的搜索都是用图。
这种搜索路径的题目实际上可以总结出一个非常通用的减少递归深度,计算量的方法,是使用一定的预处理措施,
将前期的依赖关系简化为一个图,然后使用图算法来进行路径的计算
1 import java.util.*; 2 3 public class Solution { 4 5 private void DFS(List<List<String>> map,List<String> path,List<String> res,int end){ 6 if(end==-1){ 7 String resone = ""; 8 for(int i=path.size()-1;i>=0;i--){ 9 if(i==path.size()-1) 10 resone = path.get(i); 11 else 12 resone = resone+" "+path.get(i); 13 } 14 res.add(resone); 15 return; 16 } 17 if(end<-1) return; 18 List<String> words = map.get(end); 19 for(String w: words){ 20 path.add(w); 21 DFS(map,path,res,end-w.length()); 22 path.remove(path.size()-1); 23 } 24 } 25 public List<String> wordBreak(String s, Set<String> wordDict) { 26 List<String> res = new LinkedList<String>(); 27 if(s==null||s.length()==0) return res; 28 List<List<String>> map = new LinkedList<List<String>>(); 29 boolean [] flag = new boolean[s.length()]; 30 for(int i=0;i<s.length();i++){ 31 List<String> listone = new LinkedList<String>();//以index i结尾的单词的个数 32 for(int j=i;j>=0;j--){ 33 String sub = s.substring(j,i+1); 34 if(wordDict.contains(sub)&&(j==0||flag[j-1])){ 35 listone.add(sub); 36 flag[i]=true; 37 } 38 } 39 map.add(listone); 40 } 41 List<String> path = new LinkedList<String>(); 42 DFS(map,path,res,s.length()-1); 43 return res; 44 } 45 }
[1] Word Ladder II