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

    主站蜘蛛池模板: 国产高清不卡免费在线| 操美女视频免费网站| 三年片在线观看免费观看大全动漫| 日本高清免费中文字幕不卡| 亚洲国产成人久久综合| 午夜视频在线观看免费完整版 | 亚洲精品你懂的在线观看 | 国产va在线观看免费| 久久久久亚洲精品成人网小说| 在线涩涩免费观看国产精品 | 美女又黄又免费的视频| 四虎影视精品永久免费| 久久精品亚洲综合一品| 182tv免费观看在线视频| 亚洲丰满熟女一区二区v| 久久一区二区免费播放| 国精无码欧精品亚洲一区| 日本视频免费高清一本18| 亚洲网站在线观看| 啦啦啦高清视频在线观看免费| 亚洲国产成人精品无码区二本 | 亚洲成?Ⅴ人在线观看无码| 手机看片国产免费永久| 久久久久亚洲AV成人片| 女性无套免费网站在线看| 老司机免费午夜精品视频| 亚洲精品少妇30p| 一个人免费高清在线观看| 亚洲欧美日韩综合久久久久| 亚洲高清国产拍精品青青草原| 三年片免费观看大全国语| 亚洲天堂一区在线| 国产自产拍精品视频免费看| 久久WWW免费人成—看片| 亚洲嫩草影院在线观看| 国产91在线免费| 外国成人网在线观看免费视频| 国产成人精品日本亚洲专区6| 免费永久在线观看黄网站| 国产精品99精品久久免费| 亚洲国产精品无码观看久久|