Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the word list
For example,
Given:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog"
,
return its length 5
.
Difficulty: Medium
Solution: Use HashSet and queue
public class Solution {
public String replace(String s, int index, char c) {
char[] chars = s.toCharArray();
chars[index] = c;
return new String(chars);
}
public int ladderLength(String beginWord, String endWord, Set<String> wordList) {
if(endWord.equals(beginWord))
return 1;
if(wordList == null)
return 0;
int ans = 1;
Queue<String> q = new LinkedList<String>();
Set<String> s = new HashSet<String>();
q.offer(beginWord);
s.add(beginWord);
wordList.add(endWord);
while(!q.isEmpty()){
ans++;
int len = q.size();
for(int k = 0; k < len; k++){
String word = q.poll();
for(int i = 0; i < word.length(); i++){
for(char j = 'a'; j <= 'z'; j++){
String newWord = replace(word, i, j);
if(!wordList.contains(newWord))
continue;
if(newWord.equals(endWord))
return ans;
if(s.contains(newWord))
continue;
s.add(newWord);
q.offer(newWord);
}
}
}
}
return 0;
}
}