<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小明思考

    Just a software engineer
    posts - 124, comments - 36, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    字梯游戲

    Posted on 2013-04-18 12:46 小明 閱讀(1518) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法
    問題給定兩個單詞(一個開始,一個結(jié)束)和一個字典,找出最短的從開始單詞到結(jié)束單詞的變換序列的長度,并滿足:

    1.每次只能變換一個字母
    2.所有的中間單詞必須存在于字典中

    比如:
    輸入:
    start = "hit"
    end = "cog"
    dict = ["hot","dot","dog","lot","log"]

    那么最短的變化序列是"hit" -> "hot" -> "dot" -> "dog" -> "cog",所以返回長度是5。
    注意:
    1. 如果找不到這樣的序列,返回0
    2. 所有單詞的長度都是相同的
    3. 所有單詞都只含有小寫的字母。

    分析:
    這個問題本質(zhì)是一個圖論中的尋求最短路徑的問題。之前做過一個迷宮尋路的demo,有興趣的可以看看:http://slab.sinaapp.com/pathfinder/

    為了提高效率,把輸入的HashSet轉(zhuǎn)化成數(shù)組來處理,并預先計算好他們相互的關(guān)系。下面使用的算法是BFS,在大多數(shù)情況下,都是足夠快的。如果要優(yōu)化,可以使用A*,但是實現(xiàn)的復雜度就會大幅增加。

    代碼如下:
    public class WordLadder {
        
        private boolean canChange(char[] a,char[] b){
            int diff = 0;
            int len = a.length;
            for(int i=0;i<len;++i){
                if(a[i]!=b[i]){
                    ++diff;
                    if(diff>1){
                        return false;
                    }
                }
            }
            return true;
        }
        
        public int ladderLength(String start, String end, HashSet<String> dict) {
            Object[] all = new Object[dict.size()+2];
            int t=0;
            all[t++]=start.toCharArray();
            for(String d:dict){
                all[t++]=d.toCharArray();
            }
            all[t++]=end.toCharArray();
            int size = all.length;
            boolean[][] matrix = new boolean[size][size];
            for(int i=0;i<size;++i){
                char[]si = (char[])all[i];
                for(int j=i+1;j<size;++j){
                    char[] sj = (char[])all[j];
                    if(canChange(si,sj)){
                        matrix[i][j] = matrix[j][i] = true;  
                    }
                }
            }
            
            int[] cost = new int[size];
            for(int i=0;i<size;++i){
                cost[i] = Integer.MAX_VALUE;
            }
            cost[0] = 0;
            List<Integer> openlist = new ArrayList<Integer>();
            openlist.add(0);
            int target = size-1;
            while(!openlist.isEmpty()){
                int current = openlist.remove(openlist.size()-1);
                boolean[] mn = matrix[current];
                int cc =  cost[current];
                for(int i=0;i<size;++i){
                    if(mn[i]){
                        if(i==target){ //find
                            return cc+2;
                        }
                        if(cost[i]>cc+1){
                            cost[i]=cc+1;
                            openlist.add(0,i);
                        }
                    }
                }
            }
            return 0;
        }
    }
    主站蜘蛛池模板: 精品国产免费观看一区| 91精品免费国产高清在线| 大学生一级特黄的免费大片视频| 亚洲AV午夜成人影院老师机影院| 成人毛片100免费观看| 国产啪亚洲国产精品无码| 特黄特色的大片观看免费视频| 国产日产成人免费视频在线观看| 亚洲精品无码一区二区| 国产一区二区三区在线免费| 特黄特色大片免费| 中文字幕第13亚洲另类| 一区二区三区免费视频网站| 亚洲午夜久久久久妓女影院| 久久精品成人免费网站| 亚洲综合一区二区国产精品| 亚洲免费闲人蜜桃| 亚洲国产av玩弄放荡人妇| 国产精品高清全国免费观看| 日韩精品无码免费视频| 亚洲精品无码乱码成人| 99re免费视频| 亚洲综合小说另类图片动图| 国产99视频精品免费视频7| 一级**爱片免费视频| 亚洲乱码国产一区三区| 69影院毛片免费观看视频在线| 亚洲一区二区三区高清不卡 | 亚洲另类无码专区丝袜| 国产精品麻豆免费版| 美女被免费网站91色| 亚洲欧洲国产经精品香蕉网| 大学生a级毛片免费观看| WWW国产成人免费观看视频| 亚洲综合在线视频| 国产在线ts人妖免费视频| 99精品视频在线观看免费| 亚洲电影在线播放| 亚洲?V无码乱码国产精品| 色欲色香天天天综合网站免费| 亚洲综合色婷婷在线观看|