<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 小明 閱讀(1373) 評論(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>>();
            }
        }
    }

    主站蜘蛛池模板: 欧美男同gv免费网站观看 | 亚洲av日韩av天堂影片精品| 香港a毛片免费观看 | 久久久久亚洲爆乳少妇无| 国产精品亚洲色婷婷99久久精品| 日韩在线一区二区三区免费视频| 久久er国产精品免费观看2| 亚洲色成人中文字幕网站| 91亚洲va在线天线va天堂va国产 | 亚洲精品免费网站| 亚洲国色天香视频| 一级人做人a爰免费视频| 免费一级做a爰片久久毛片潮喷| 美女被免费视频网站| 亚洲乱码日产精品a级毛片久久| 一个人看的hd免费视频| 中文字幕精品亚洲无线码一区 | 久久久久亚洲AV无码专区体验| 91精品国产免费久久国语蜜臀| 久久久久亚洲Av无码专| 亚色九九九全国免费视频| 亚洲成a人片在线不卡一二三区| 日本免费污片中国特一级| 久久亚洲美女精品国产精品| 中文字幕免费在线看线人 | 日本特黄特色免费大片| 久久精品国产亚洲夜色AV网站| 免费观看久久精彩视频| 亚洲伊人精品综合在合线| 好男人视频在线观看免费看片| 亚洲电影国产一区| 国产成人免费在线| 精品亚洲456在线播放| 亚洲第一区在线观看| 皇色在线免费视频| 亚洲自偷自拍另类图片二区| 嫩草影院在线免费观看| 国产无遮挡又黄又爽免费网站| 亚洲VA综合VA国产产VA中| 久久成人免费播放网站| 亚洲AV男人的天堂在线观看|