Word Ladder II
1 public class Solution { 2 public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) { 3 List<List<String>> res = new LinkedList<List<String>>(); 4 Map<String, Integer> visited = new HashMap<>(); 5 Queue<Node> queue = new LinkedList<>(); 6 List<Node> nodeList = new LinkedList<Node>(); 7 visited.put(beginWord, 0); 8 queue.offer(new Node(beginWord)); 9 int lastCnt = 1; 10 int currCnt = 0; 11 int level = 1; 12 boolean foundEndWord = false; 13 14 while(!queue.isEmpty()) { 15 Node currNode = queue.poll(); 16 StringBuilder wordBuff = new StringBuilder(currNode.word); 17 lastCnt--; 18 for(int i = 0; i < wordBuff.length(); i++) { 19 char currChar = wordBuff.charAt(i); 20 for(char c = 'a'; c <= 'z'; c++) { 21 if(c == currChar) { 22 continue; 23 } 24 25 wordBuff.setCharAt(i, c); 26 String tmpWord = wordBuff.toString(); 27 Node tmpNode = new Node(tmpWord, currNode); 28 29 if(endWord.equals(tmpWord)) { 30 nodeList.add(tmpNode); 31 foundEndWord = true; 32 } 33 34 if(wordList.contains(tmpWord)) { 35 if(visited.containsKey(tmpWord) && visited.get(tmpWord)<level) { 36 continue; 37 } 38 currCnt++; 39 queue.offer(tmpNode); 40 visited.put(tmpWord, level); 41 } 42 } 43 wordBuff.setCharAt(i, currChar); 44 } 45 46 if(lastCnt == 0) { 47 if(foundEndWord) { 48 break; 49 } 50 lastCnt = currCnt; 51 currCnt = 0; 52 level++; 53 } 54 } 55 56 for(Node currNode: nodeList) { 57 List<String> list = new LinkedList<>(); 58 list.add(currNode.word); 59 while(currNode.parent != null) { 60 list.add(0, currNode.parent.word); 61 currNode = currNode.parent; 62 } 63 res.add(list); 64 } 65 66 return res; 67 } 68 69 class Node { 70 Node parent; 71 String word; 72 73 public Node(String word){ 74 this.word = word; 75 } 76 77 public Node(String word, Node parent) { 78 this.word = word; 79 this.parent = parent; 80 } 81 } 82 }