leetcode word-ladder 2
题目描述
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start ="hit"
end ="cog"
dict =["hot","dot","dog","lot","log"]
Return
[ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
Note:
- All words have the same length.
- All words contain only lowercase alphabetic characters.
提示超时,求大神看一下是复杂度的问题还是循环问题
import java.util.*; class Solution { public ArrayList<ArrayList<String>> findLadders(String start, String end, HashSet<String> dict) { if(start==null||end==null) return null; ArrayList<ArrayList<String>> res=new ArrayList<ArrayList<String>>(); if(start==end){ ArrayList<String> arr=new ArrayList<String>(); arr.add(start); res.add(arr); return res; } dict.add(start); dict.add(end); HashMap<String,ArrayList<String>> rev=new HashMap<String,ArrayList<String>>();//逆向建立图 ArrayList<String> cur=new ArrayList<String>();//当前层 ArrayList<String> next;//下一层 cur.add(start); dict.remove(start); while(cur.size()>0){//从start开始建立图,并逆向保存 next=new ArrayList<String>(); for(String s:cur){ for(int i=0;i<s.length();i++){ char[] ch=s.toCharArray(); for(char c='a';c<='z';c++){ if(ch[i]==c) continue; ch[i]=c; String compare=new String(ch); if(dict.contains(compare)){ next.add(compare); if(!rev.containsKey(compare)){ ArrayList<String> arr=new ArrayList<String>(); arr.add(s); rev.put(compare,arr); } else{ rev.get(compare).add(s); } } } } } for(String s:next){ dict.remove(s); } cur=next; } BFS(res,rev,end,start); return res; } public void BFS(ArrayList<ArrayList<String>> res,HashMap<String,ArrayList<String>> rev,String end,String start){ Queue<Map<String, ArrayList<String>>> q= new LinkedList<Map<String,ArrayList<String>>>();//保存遍历的结点以及路径 ArrayList<String> arr=new ArrayList<String>(); arr.add(end); Map<String, ArrayList<String>> map=new HashMap<String,ArrayList<String>>(); map.put(end,arr); q.add(map); while(!q.isEmpty()){ map=q.poll(); String cur=map.entrySet().iterator().next().getKey(); arr=map.entrySet().iterator().next().getValue(); if(cur==start){ res.add(arr); } else{ if(rev.containsKey(cur)) for(String s:rev.get(cur)){ ArrayList<String> path = new ArrayList<String>(); path.add(s); path.addAll(arr); map=new HashMap<String,ArrayList<String>>(); map.put(s,path); q.add(map); } } } } }