/* * 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; }