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
.
Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
思路:最短路BFS,每次尝试换成另外25个字符,答案是走的步数,也就是每新一轮BFS入队后的都出队后,那么我们才需要更新一次答案。
public class Solution {
public int ladderLength(String beginWord, String endWord, Set<String> wordList) {
if (beginWord.length() != endWord.length()) return 0;
if (beginWord.length() == 0 || endWord.length() == 0) return 0;
LinkedList<String> queue = new LinkedList<String>();
queue.add(beginWord);
wordList.remove(beginWord);
int ans = 1;
int count = 1;
while (wordList.size() > 0 && !queue.isEmpty()) {
String current = queue.poll();
--count;
for (int i = 0; i < current.length(); i++) {
char[] tmp = current.toCharArray();
for (char j = 'a'; j <= 'z'; j++) {
if (tmp[i] == j) continue;
tmp[i] = j;
String tmpStr = new String(tmp);
if (tmpStr.equals(endWord)) return ans + 1;
if (wordList.contains(tmpStr)) {
queue.add(tmpStr);
wordList.remove(tmpStr);
}
}
}
if (count == 0) {
count = queue.size();
++ans;
}
}
return 0;
}
}