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.
public class Solution {
public List<List<String>> findLadders(String start, String end, Set<String> dict) {
List<List<String>> result=new ArrayList<List<String>>();
HashMap<String,Integer> map=ladderLength(start,end,dict);
if (map.containsKey(end)==false) return result;
int ladderSize=map.get(end);
result=getLadders(start,end,map,ladderSize);
return result;
}
public List<List<String>> getLadders(String start, String end, HashMap<String, Integer> map,int ladderSize){
List<List<String>> result=new ArrayList<List<String>>();
List<String> oneStep = new ArrayList<String>();
if(ladderSize==1){
oneStep.add(start);
result.add(oneStep);
return result;
}
String temp="";
for(int i=0;i<end.length();i++){
for(int j=0;j<26;j++){
char m=(char)('a'+j);
temp=end.substring(0,i)+m+end.substring(i+1);
if(map.containsKey(temp)&&map.get(temp)==ladderSize-1){
oneStep.add(temp);
}
}
}
for(int i=0;i<oneStep.size();i++){
List<List<String>> tempList=getLadders(start,oneStep.get(i),map,ladderSize-1);
for(int j=0;j<tempList.size();j++){
List<String> tempPath=tempList.get(j);
tempPath.add(end);
result.add(tempPath);
}
}
return result;
}
public HashMap<String,Integer> ladderLength(String start, String end, Set<String> dict) {
HashMap<String,Integer> map=new HashMap<String,Integer>();
Queue<String>q=new LinkedList<String>();
String word="",temp="";
q.add(start);
map.put(start,1);
int curstep=0;
while(q.isEmpty()==false){
word=q.poll();
curstep=map.get(word);
if(word.compareTo(end)==0) break;
for(int i=0;i<word.length();i++){
for(int j=0;j<26;j++){
char m=(char)('a'+j);
temp=word.substring(0,i)+m+word.substring(i+1,word.length());
if(dict.contains(temp)&&!map.containsKey(temp)){
map.put(temp,curstep+1);
q.add(temp);
}
}
}
}
return map;
}
}