Word Ladder — BFS Shortest Transformation Path
Advertisement
Problem 290 · Word Ladder
Difficulty: Medium · Pattern: BFS on Word Graph
Return the shortest transformation length from beginWord to endWord.
Solutions
# Python
from collections import deque
def ladderLength(beginWord, endWord, wordList):
wordSet = set(wordList)
if endWord not in wordSet: return 0
queue = deque([(beginWord, 1)])
visited = {beginWord}
while queue:
word, steps = queue.popleft()
for i in range(len(word)):
for c in 'abcdefghijklmnopqrstuvwxyz':
new_word = word[:i] + c + word[i+1:]
if new_word == endWord: return steps+1
if new_word in wordSet and new_word not in visited:
visited.add(new_word)
queue.append((new_word, steps+1))
return 0
// Java
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
Set<String> wordSet = new HashSet<>(wordList);
if (!wordSet.contains(endWord)) return 0;
Queue<String> q = new LinkedList<>(); q.offer(beginWord);
Set<String> visited = new HashSet<>(); visited.add(beginWord);
int steps = 1;
while (!q.isEmpty()) {
int size = q.size(); steps++;
while (size-->0) {
String word = q.poll(); char[] arr = word.toCharArray();
for (int i=0;i<arr.length;i++) {
char orig = arr[i];
for (char c='a';c<='z';c++) {
arr[i]=c; String newW=new String(arr);
if (newW.equals(endWord)) return steps;
if (wordSet.contains(newW) && !visited.contains(newW)) {
visited.add(newW); q.offer(newW);
}
}
arr[i]=orig;
}
}
}
return 0;
}
Complexity
- Time: O(M^2 * N) where M = word length, N = word list size
- Space: O(M^2 * N)
Advertisement