Think those words can form a graph, do the BFS in the graph to find the shortest path from the startWord to the endWord.
public class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
if (wordList == null) {
return 0;
}
// coverting list to hashset which reduces the time cost of contains()
HashSet<String> dict = new HashSet<>();
for (String word : wordList) {
dict.add(word);
}
if (beginWord.equals(endWord)) {
return 1;
}
int length = 1;
Queue<String> queue = new LinkedList<>();
HashSet<String> words = new HashSet<>();
queue.offer(beginWord);
words.add(beginWord);
while (!queue.isEmpty()) {
length++;
int size = queue.size();
for (int i=0; i<size; i++) {
String word = queue.poll();
for (String s : getTransform(word, dict, words)) {
if (s.equals(endWord))
return length;
if (!words.contains(s)) {
queue.offer(s);
words.add(s);
}
}
}
}
return 0;
}
private static HashSet<String> getTransform(String word, HashSet<String> dict, HashSet<String> words) {
HashSet<String> set = new HashSet<>();
// replace each letter in the word by 26 lowercase letters from 'a' to 'z'
// check each combination in the dict
for (int i=0; i<word.length(); i++) {
for (char c='a'; c<='z'; c++) {
if (c == word.charAt(i)) continue;
StringBuilder sb = new StringBuilder(word);
sb.setCharAt(i, c);
if (dict.contains(sb.toString())) {
set.add(sb.toString());
}
}
}
return set;
}
}