126.word-ladder-ii.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import java.util.*;
  2. class Solution {
  3. private List<List<String>> res;
  4. private List<List<Integer>> prev;
  5. private List<String> wordList;
  6. private String beginWord;
  7. public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
  8. res = new ArrayList<>();
  9. prev = new ArrayList<>();
  10. this.wordList = wordList;
  11. this.beginWord = beginWord;
  12. int[] dist = new int[wordList.size()];
  13. boolean[] used = new boolean[wordList.size()];
  14. int endIdx = -1;
  15. List<Integer> queue = new ArrayList<>();
  16. for (int i = 0; i < wordList.size(); i++) {
  17. prev.add(new ArrayList<>());
  18. String word = wordList.get(i);
  19. if (word.equals(endWord)) endIdx = i;
  20. if (isConvertible(beginWord, word)) {
  21. used[i] = true;
  22. prev.get(i).add(-1);
  23. dist[i] = 1;
  24. queue.add(i);
  25. }
  26. }
  27. if (endIdx == -1) return res;
  28. while (!queue.isEmpty()) {
  29. List<Integer> newQueue = new ArrayList<>();
  30. for (Integer i : queue) {
  31. for (int j = 0; j < wordList.size(); j++) {
  32. if (used[j]) continue;
  33. if (!isConvertible(wordList.get(i), wordList.get(j))) continue;
  34. prev.get(j).add(i);
  35. if (dist[j] != 0) continue;
  36. dist[j] = dist[i] + 1;
  37. newQueue.add(j);
  38. }
  39. }
  40. queue = newQueue;
  41. for (Integer i : queue) used[i] = true;
  42. }
  43. dfs(endIdx, new LinkedList<String>());
  44. return res;
  45. }
  46. private void dfs(int idx, LinkedList<String> path) {
  47. List<String> newPath = new ArrayList<>();
  48. if (idx == -1) {
  49. newPath.add(beginWord);
  50. newPath.addAll(path);
  51. res.add(newPath);
  52. return;
  53. }
  54. path.addFirst(wordList.get(idx));
  55. for (Integer i : prev.get(idx)) {
  56. dfs(i, path);
  57. }
  58. path.pollFirst();
  59. }
  60. private boolean isConvertible(String w1, String w2) {
  61. int cnt = 0;
  62. for (int i = 0; i < w1.length(); i++) {
  63. if (w1.charAt(i) != w2.charAt(i)) cnt++;
  64. }
  65. return cnt == 1;
  66. }
  67. }