Word Ladder 2015年6月3日

Given two words (beginWord and endWord), and a dictionary, 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 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.

 Runtime:628ms

hit->hot->dot->dog->cog

hit->hot->lot->log->dog->cog

采用队列的优势就在只会在头部删除,尾部添加。

在队列中存在两元素 dot lot 时,dot启动查找匹配找到dict中存在的元素dog,并将其添加到队列中,因为队列的特性,dog会添加在lot之后

下一轮会先取出lot,这样就保证了每轮查找不同分支之间平行进行,最先return的就是最短的transformation

public class Solution {
    public int ladderLength(String beginWord, String endWord, Set<String> wordDict) {
         if (wordDict == null || wordDict.size() == 0) {
                return 0;
         }
         Queue<String> queue = new LinkedList<String>();
         queue.offer(beginWord);
         wordDict.remove(beginWord);
         int length = 1;
         while(!queue.isEmpty()) {
             int count = queue.size();
             for(int i=0; i<count; i++) {
                 //Retrieves and removes the head of this queue, or returns null if this queue is empty 
                 String current = queue.poll();
                 for (char c = 'a'; c<='z'; c++) {
                     for (int j=0; j < current.length(); j++) {
                         if(c == current.charAt(j)) {
                             continue;
                         }
                         String tmp = replace(current, j, c);
                         if(tmp.equals(endWord)) {
                             return length +1;
                         }
                         if(wordDict.contains(tmp)) {
                             queue.offer(tmp);
                             wordDict.remove(tmp);
                         }
                     }
                 }
                
             }
             length++;
         }
         return 0;
    }
    
    private String replace(String s, int index ,char c) {
         char[] chars = s.toCharArray();
         chars[index] = c;
         return new String(chars);
    }
}

 

posted @ 2015-06-03 23:50  疾风剑  阅读(190)  评论(0编辑  收藏  举报