此题要多品品。由于是求最短的路径,所以用BFS,DFS会在大数据的时候超时,原因也容易理解。最终解法参考了:http://discuss.leetcode.com/questions/1108/word-ladder 和 http://blog.sina.com.cn/s/blog_b9285de20101j1xl.html
1.用了char[] curr=queue.poll().toCharArray();这个在字符串中间替换字符时很有用;
2.用了thisLevel和nextLevel。本来用DFS的时候记录dist很自然,多一个递归dist++就行了。BFS的时候有点不知所措,现在知道了可以记录这一层的个数和下一层的个数。
public class Solution { public int ladderLength(String start, String end, HashSet<String> dict) { int dist = 1; if (start.equals(end)) return dist; HashSet<String> added = new HashSet<String>(); Queue<String> queue = new LinkedList<String>(); queue.offer(start); added.add(start); int thisLevel = 1; int nextLevel = 0; while (queue.size() != 0) { char[] curr=queue.poll().toCharArray(); thisLevel--; for (int i = 0; i < start.length(); i++) { char tmp = curr[i]; for (char c = 'a'; c <= 'z'; c++) { if (c == tmp) continue; curr[i] = c; String str = new String(curr); if (str.equals(end)) return dist + 1; if (dict.contains(str) && !added.contains(str)) { queue.offer(str); added.add(str); nextLevel++; } } curr[i] = tmp; } if (thisLevel == 0) { thisLevel = nextLevel; nextLevel = 0; dist++; } } return 0; } }
其实说白了,就是topo图的BFS,建个图更清晰,但也更麻烦一些。
http://blog.csdn.net/beiyetengqing/article/details/8580577