127. Word Ladder

    /*
     * 127. Word Ladder
     * 2016-5-21 by Mingyang
     * 这道题目就是典型的把题目转换为graph的题目,首先我们从一个string start出发
     * 我们先给题目进行图的映射,顶点则是每个字符串,然后两个字符串如果相差一个字符则我们进行连边。
     * 接下来看看这个方法的优势,注意到我们的字符集只有小写字母,而且字符串长度固定,
     * 假设是L。那么可以注意到每一个字符可以对应的边则有25个(26个小写字母减去自己),
     * 那么一个字符串可能存在的边是25*L条。接下来就是检测这些边对应的字符串是否在字典里,就可以得到一个完整的图的结构了。
     * 关键1.就像我们以前做Tree的时候用queue来做,这样的话把所有的子节点全部push到queue里面去,同时每一行都精确到本行的数有多少个
     * 好控制什么时候进入到下一行。
     */
    public int ladderLength(String start, String end, Set<String> dict) {
        if (start == null || end == null || start.length() == 0
                || end.length() == 0 || start.length() != end.length())
            return 0;
        LinkedList<String> queue = new LinkedList<String>();
        Set<String> visited = new HashSet<String>();
        int level = 1;
        int lastNum = 1;
        int curNum = 0;
        queue.offer(start);
        visited.add(start);
        while (!queue.isEmpty()) {
            String cur = queue.poll();
            lastNum--;
            for (int i = 0; i < cur.length(); i++) {
                char[] charCur = cur.toCharArray();
                for (char c = 'a'; c <= 'z'; c++) {
                    charCur[i] = c;
                    String temp = new String(charCur);
                    if (temp.equals(end))
                        return level + 1;
                    if (dict.contains(temp) && !visited.contains(temp)) {
                        curNum++;
                        queue.offer(temp);
                        visited.add(temp);
                    }
                }
            }
            if (lastNum == 0) {
                lastNum = curNum;
                curNum = 0;
                level++;
            }
        }
        return 0;
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5516174.html