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.
Not found the correct solution yet.
public class Solution { public List<List<String>> findLadders(String start, String end, Set<String> dict) { List<List<String>> soln = new ArrayList<List<String>>(); int len = start.length(); boolean exist = false; Set<String> chk = new HashSet<String>(); Map<String, List<String>> graph = new HashMap<String, List<String>>(); Queue<String> level = new LinkedList<String>(); level.add(start); chk.add(start); dict.add(end); while(level.peek() != null) { Set<String> toBuild = new HashSet<String>(); Queue<String> nextLevel = new LinkedList<String>(); while(level.peek() != null) { List<String> neighbor = new ArrayList<String>(); String wd = level.poll(); char[] word = wd.toCharArray(); for(int i = 0; i < len; ++i) { char ch = word[i]; for(char c = 'a'; c <= 'z'; ++c){ word[i] = c; String nword = new String(word); if(dict.contains(nword) && !chk.contains(nword)) { if(toBuild.add(nword)) nextLevel.add(nword); neighbor.add(nword); } exist = exist || nword.equals(end); } word[i] = ch; } graph.put(wd, neighbor); } chk.addAll(toBuild); if(exist) break; level = nextLevel; } if(exist) dfs(start, end, graph, new ArrayList<String>(), soln); return soln; } private void dfs(String start, String end, Map<String, List<String>> graph, List<String> oneSoln, List<List<String>> soln){ if(start.equals(end)){ List<String> oneSolution = new ArrayList<String>(); oneSolution.addAll(oneSoln); oneSolution.add(start); soln.add(oneSolution); return; } if(!graph.containsKey(start)) return; if(graph.containsKey(start)) { oneSoln.add(start); List<String> alist = graph.get(start); for(int i = 0; i < alist.size(); ++i) dfs(alist.get(i), end, graph, oneSoln, soln); oneSoln.remove(oneSoln.size() - 1); } } }