Word Ladder
public class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
if (beginWord.equals(endWord)) return 0;
Set<String> isWord = new HashSet<>(wordList); //check if word in dict
Set<String> visited = new HashSet<>(); //dedup
Queue<String> q = new LinkedList<>();
visited.add(beginWord);
q.offer(beginWord);
int count = 1;
while(!q.isEmpty()){ //BFS
int size = q.size(); //current layer width
count++;
for (int i = 0; i < size; i++){
String current = q.poll();
boolean foundEnd = addNeighbors(current, q, visited, isWord, endWord);
if (foundEnd) return count;
}
}
return 0;
}
private boolean addNeighbors(String word, Queue<String> q, Set<String> visited, Set<String> isWord, String endWord){
StringBuilder sb = new StringBuilder(word);
visited.add(word);
//every letter at every index
for (int i = 0; i < word.length(); i++){
char orig = word.charAt(i);
for(char j = 'a'; j <= 'z'; j++){
if (j == orig) continue;
sb.setCharAt(i, j);
String modifiedWord = sb.toString();
if (modifiedWord.equals(endWord)) return true; //generated target word
if (isWord.contains(modifiedWord) && !visited.contains(modifiedWord)){
q.offer(modifiedWord);
}
}
sb.setCharAt(i, orig);
}
return false;
}
}Last updated