Description:
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
.
Solution:
第一反应就是最短路,dijkstra的做法就是BFS
这里有个小trick,为了省下使用visited数字,每次进入队列的String都直接去掉
<span style="font-size:18px;">import java.util.*;
public class Solution {
public int ladderLength(String beginWord, String endWord,
Set<String> wordList) {
LinkedList<String> queue = new LinkedList<String>();
queue.add(beginWord);
wordList.remove(beginWord);
int n = beginWord.length();
int step = 0;
String cur, neo;
char[] cur_char = new char[n];
while (!queue.isEmpty()) {
int size = queue.size();
step++;
for (int i = 0; i < size; i++) {
cur = queue.poll();
cur_char = cur.toCharArray();
for (int j = 0; j < n; j++) {
for (int c = 'a'; c <= 'z'; c++) {
if (cur_char[j] == c)
continue;
cur_char[j] = (char) c;
neo = new String(cur_char);
if (neo.equals(endWord))
return step + 1;
if (wordList.contains(neo)) {
queue.add(neo);
wordList.remove(neo);
}
cur_char[j] = cur.charAt(j);
}
}
}
}
return 0;
}
}</span>