1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import java.util.*;
- class Solution {
- private List<List<String>> res;
- private List<List<Integer>> prev;
- private List<String> wordList;
- private String beginWord;
- public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
- res = new ArrayList<>();
- prev = new ArrayList<>();
- this.wordList = wordList;
- this.beginWord = beginWord;
- int[] dist = new int[wordList.size()];
- boolean[] used = new boolean[wordList.size()];
- int endIdx = -1;
- List<Integer> queue = new ArrayList<>();
- for (int i = 0; i < wordList.size(); i++) {
- prev.add(new ArrayList<>());
- String word = wordList.get(i);
- if (word.equals(endWord)) endIdx = i;
- if (isConvertible(beginWord, word)) {
- used[i] = true;
- prev.get(i).add(-1);
- dist[i] = 1;
- queue.add(i);
- }
- }
- if (endIdx == -1) return res;
- while (!queue.isEmpty()) {
- List<Integer> newQueue = new ArrayList<>();
- for (Integer i : queue) {
- for (int j = 0; j < wordList.size(); j++) {
- if (used[j]) continue;
- if (!isConvertible(wordList.get(i), wordList.get(j))) continue;
- prev.get(j).add(i);
- if (dist[j] != 0) continue;
- dist[j] = dist[i] + 1;
- newQueue.add(j);
- }
- }
- queue = newQueue;
- for (Integer i : queue) used[i] = true;
- }
- dfs(endIdx, new LinkedList<String>());
- return res;
- }
- private void dfs(int idx, LinkedList<String> path) {
- List<String> newPath = new ArrayList<>();
- if (idx == -1) {
- newPath.add(beginWord);
- newPath.addAll(path);
- res.add(newPath);
- return;
- }
- path.addFirst(wordList.get(idx));
- for (Integer i : prev.get(idx)) {
- dfs(i, path);
- }
- path.pollFirst();
- }
- private boolean isConvertible(String w1, String w2) {
- int cnt = 0;
- for (int i = 0; i < w1.length(); i++) {
- if (w1.charAt(i) != w2.charAt(i)) cnt++;
- }
- return cnt == 1;
- }
- }
|