<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>>();
            }
        }
    }

    主站蜘蛛池模板: 国产精品亚洲精品爽爽| japanese色国产在线看免费| 青青草国产免费久久久下载| 美女黄频免费网站| 久久被窝电影亚洲爽爽爽| 色影音免费色资源| 国产亚洲精品91| 亚洲国产精品第一区二区| 人妻视频一区二区三区免费| 一级做a毛片免费视频| 亚洲小视频在线观看| 日本免费高清一本视频| 伊人免费在线观看| 亚洲国产系列一区二区三区| 久久久久一级精品亚洲国产成人综合AV区 | 久久精品国产亚洲一区二区| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 黄色成人网站免费无码av| 日韩精品视频在线观看免费| 久久亚洲精精品中文字幕| 国产免费人成在线视频| 亚洲AV永久无码精品| 永久免费AV无码国产网站| 国产成人1024精品免费| 亚洲日产乱码一二三区别| 亚洲av无码乱码国产精品fc2| 女人张开腿给人桶免费视频| 青青草无码免费一二三区| 日韩在线视频线视频免费网站| 亚洲mv国产精品mv日本mv| 亚洲第一AV网站| 免费一级毛片在播放视频| 国产免费女女脚奴视频网| a在线观看免费视频| 理论片在线观看免费| 国产亚洲福利在线视频| 亚洲综合区图片小说区| 久久精品7亚洲午夜a| 亚洲免费观看视频| 国产成人精品亚洲| 亚洲粉嫩美白在线|