leetcode中最难的一道,常做常新
public class Solution {
public List<List<String>> findLadders(String beginWord, String endWord, Set<String> wordList) {
List<List<String>> res = new LinkedList<>();
Set<String> visited = new HashSet<>();
Set<String> unVisited = new HashSet<>();
unVisited.add(endWord);
unVisited.addAll(wordList);
Queue<WordNode> queue = new LinkedList<>();
queue.offer(new WordNode(beginWord, new LinkedList<>()));
int minSteps = Integer.MAX_VALUE;
int prevSteps = 1;
while (!queue.isEmpty()) {
WordNode top = queue.poll();
int curSteps = top.getSize();
if (top.word.equals(endWord)) {
if (curSteps > minSteps) {//确保只输出最短的
return res;
}
minSteps = curSteps;
res.add(top.transformList);
}
if (curSteps > prevSteps) {//不能直接从wordList中直接删除访问过的字符串,需要引入两个新的集合,只有转换步数发生变化,才从字典中移除(观察到不同转换序列不可能出现重复的词,除了首尾两个词)
unVisited.removeAll(visited);
prevSteps = curSteps;
}
for (int i = 0; i < top.word.length(); i++) {
char[] chars = top.word.toCharArray();
for (char c = 'a'; c <= 'z'; c++) {
if (chars[i] == c) {
continue;
}
chars[i] = c;
String newWord = new String(chars);
if (unVisited.contains(newWord)) {
//queue.offer(endWord, top.transformList);
//queue.offer(new WordNode(endWord, top.transformList));
queue.offer(new WordNode(newWord, top.transformList));
visited.add(newWord);
}
}
}
}
return res;
}
class WordNode {
String word;
List<String> transformList;
public WordNode (String word, List<String> list) {
this.word = word;
this.transformList = new LinkedList<>(list);
this.transformList.add(word);
}
public int getSize() {
return transformList.size();
}
}
}