Only one letter can be changed at a time
Each intermediate word must exist in the dictionary
For example,
Given:
start = "hit"
end = "cog"
dict = ["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思路解决:维护一个层级遍历队列,考察当前层的每个单词,通过修改一个字母得到的新单词若出现在dict中则将新单词添加到考察队列的下一层中,且将该新单词从dict中删除,以避免出现hot-dot-hot的死循环,一层遍历完后考察下一层。bfs保证第一次找到endWord肯定是最短路径,因为bfs是层次遍历,同一层每个单词到beginWord的变换距离是相等的。参考 http://www.cnblogs.com/TenosDoIt/p/3443512.html
public class Solution { public int ladderLength(String beginWord, String endWord, Set<String> wordDict) { if (beginWord == null || endWord == null || wordDict == null) return -1; LinkedList<String> queue = new LinkedList<String>(); queue.offer(beginWord); int len = 0; int currLevel = 0, nextLevel = 1; int L = beginWord.length(); while (!queue.isEmpty()) { if (currLevel == 0) { currLevel = nextLevel; nextLevel = 0; len++; } char[] curr = queue.poll().toCharArray(); for (int i = 0; i < L; i++) { char oldChar = curr[i]; for (char c = 'a'; c <= 'z'; c++) { if (c == oldChar) continue; curr[i] = c; String newWord = new String(curr); if (newWord.equals(endWord)) return len + 1; else if (wordDict.contains(newWord)) { nextLevel++; queue.offer(newWord); wordDict.remove(newWord); } } curr[i] = oldChar; } currLevel--; } return 0; } }