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

    字梯游戲II

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

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

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

    那么最短的變化序列有兩個
    ["hit","hot","dot","dog","cog"],
    ["hit","hot","lot","log","cog"]。
    注意:
    1. 所有單詞的長度都是相同的
    2. 所有單詞都只含有小寫的字母。

    分析:
    跟之前的字梯游戲相比,這個問題要求求出所有的最短序列,所以要使用一個Prev List來記錄前驅節點(可能不止一個)。這樣根據這個Prev List就可以遍歷出所有的最短組合。

    代碼如下:

    public class WordLadder2 {
        private List<List<Integer>> prev;
        private String[] allWords;

        private boolean canChange(String a, String b) {
            int diff = 0;
            int len = a.length();
            for (int i = 0; i < len; ++i) {
                if (a.charAt(i) != b.charAt(i)) {
                    ++diff;
                    if (diff > 1) {
                        return false;
                    }
                }
            }
            return true;
        }

        private ArrayList<ArrayList<String>> perm(int node) {
            ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
            String current = allWords[node];
            if (node == 0) {
                ArrayList<String> as = new ArrayList<String>();
                as.add(current);
                result.add(as);
            } else {
                List<Integer> p = prev.get(node);
                for (Integer pnode : p) {
                    ArrayList<ArrayList<String>> subResult = perm(pnode.intValue());
                    for (ArrayList<String> as : subResult) {
                        as.add(current);
                        result.add(as);
                    }
                }
            }
            return result;
        }

        public ArrayList<ArrayList<String>> findLadders(String start, String end,
                HashSet<String> dict) {
            allWords = new String[dict.size() + 2];
            int t = 0;
            allWords[t++] = start;
            for (String d : dict) {
                allWords[t++] = d;
            }
            allWords[t++] = end;
            int size = allWords.length;
            boolean[][] matrix = new boolean[size][size];
            for (int i = 0; i < size; ++i) {
                String si = allWords[i];
                for (int j = i + 1; j < size; ++j) {
                    String sj = allWords[j];
                    if (canChange(si, sj)) {
                        matrix[i][j] = matrix[j][i] = true;
                    }
                }
            }

            int[] cost = new int[size];
            prev = new ArrayList<List<Integer>>();
            for (int i = 0; i < size; ++i) {
                cost[i] = Integer.MAX_VALUE;
                prev.add(new ArrayList<Integer>());
            }
            cost[0] = 0;
            List<Integer> openlist = new ArrayList<Integer>();
            openlist.add(0);
            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 (cost[i] > cc + 1) {
                            cost[i] = cc + 1;
                            prev.get(i).clear();
                            prev.get(i).add(current);
                            openlist.add(0, i);
                        } else if (cost[i] == cc + 1) {
                            prev.get(i).add(current);
                        }
                    }
                }
            }

            if (cost[size - 1] != Integer.MAX_VALUE) {
                return perm(size - 1);
            } else {
                return new ArrayList<ArrayList<String>>();
            }
        }
    }

    主站蜘蛛池模板: 国产亚洲美女精品久久久久| 亚洲AV无码专区在线亚| 免费中文字幕视频| 国产成人免费手机在线观看视频| 亚洲综合精品伊人久久| 成人免费在线观看网站| 亚洲国产成人精品无码区二本 | 久久国产精品2020免费m3u8| 亚洲人精品午夜射精日韩| a国产成人免费视频| 久久久久亚洲Av无码专| 2021国产精品成人免费视频| 一本色道久久88亚洲精品综合 | 国产92成人精品视频免费| 自拍日韩亚洲一区在线| 免费特级黄毛片在线成人观看| 美女被免费视频网站| 中文字幕亚洲一区| 久久免费视频99| 亚洲三级在线免费观看| 日韩精品免费电影| 一级看片免费视频| 国产亚洲3p无码一区二区| 最近2018中文字幕免费视频| 亚洲欧美日韩综合俺去了| 亚洲人成网站观看在线播放| 一个人免费视频在线观看www | 国产羞羞的视频在线观看免费| 亚洲码在线中文在线观看| 国产精品成人无码免费| 国产精品免费αv视频| 亚洲欧洲中文日产| 国产国产人免费人成免费视频| 中文字幕免费在线播放| 亚洲人成在线播放| 亚洲婷婷国产精品电影人久久| 日本免费网站视频www区| 一级毛片高清免费播放| 亚洲成电影在线观看青青| 亚洲国产成人爱av在线播放| 一级毛片免费观看不卡视频|