BFS with letter substitution
Time O(N × L × 26) Space O(N × L)Put the word list in a set (return 0 if endWord is missing). BFS from beginWord; remove words from the set when enqueued so they're visited once.
import java.util.*;
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
Set<String> dict = new HashSet<>(wordList);
if (!dict.contains(endWord)) return 0;
Deque<String> q = new ArrayDeque<>();
q.offer(beginWord);
dict.remove(beginWord);
for (int len = 1; !q.isEmpty(); len++) {
for (int size = q.size(); size > 0; size--) {
String w = q.poll();
if (w.equals(endWord)) return len;
char[] c = w.toCharArray();
for (int i = 0; i < c.length; i++) {
char orig = c[i];
for (char ch = 'a'; ch <= 'z'; ch++) {
if (ch == orig) continue;
c[i] = ch;
String t = new String(c);
if (dict.remove(t)) q.offer(t);
}
c[i] = orig;
}
}
}
return 0;
}
}Verdict: Generating neighbours beats comparing every pair of words (O(N² L)).