<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    字梯游戲

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

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

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

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

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

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

    代碼如下:
    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;
        }
    }
    主站蜘蛛池模板: 久久精品成人免费网站| 日本高清不卡aⅴ免费网站| 日本片免费观看一区二区| 亚洲AV日韩AV永久无码免下载| eeuss影院免费直达入口| 国产91在线免费| 免费高清A级毛片在线播放| 免费在线不卡视频| 瑟瑟网站免费网站入口| 国产亚洲精久久久久久无码AV| 国产亚洲精品91| 亚洲色精品vr一区二区三区| a级毛片毛片免费观看久潮| 国产亚洲精品观看91在线| 久久精品电影免费动漫| 久久亚洲私人国产精品| 日韩免费一区二区三区在线| 2017亚洲男人天堂一| 国产精品无码一区二区三区免费| 女bbbbxxxx另类亚洲| 成人午夜亚洲精品无码网站 | 亚洲色欲色欲www在线播放 | 国产精品公开免费视频| 成人福利在线观看免费视频| 久久精品国产亚洲一区二区三区| 国产亚洲精品免费视频播放| 久久亚洲精品中文字幕| 黄页网站免费在线观看| 亚洲AV无码一区二区三区网址| 亚洲av区一区二区三| 69精品免费视频| 九九精品国产亚洲AV日韩| 亚洲精品亚洲人成人网| 欧美a级在线现免费观看| 日本一区二区在线免费观看| 亚洲美免无码中文字幕在线| 国产一区二区三区在线免费观看| 两个人看的www免费高清| 亚洲人成网站在线观看播放动漫| 波多野结衣一区二区免费视频| A片在线免费观看|