• 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);
        }
    }
  • 相关阅读:
    Linux硬盘分区方案
    mysql笔记四:索引查询及处理
    thread 学习笔记
    mysql笔记二:基本数据库、表查询操作
    linux 自学系列:监测端口占用情况
    linux 自学系列:命令行传输文件
    mysql笔记三:基本数据库、表创建更新操作
    mysql笔记五:权限管理
    threading源代码问题,为什么要将引入的变量del?
    linux 自学系列:更改系统语言编码
  • 原文地址:https://www.cnblogs.com/hixin/p/4549416.html
Copyright © 2020-2023  润新知