题目
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such that:
- Only one letter can be changed at a time
- Each intermediate word must exist in the dictionary
For example,
Given:
start ="hit"
end ="cog"
dict =["hot","dot","dog","lot","log"]
As one shortest transformation is
"hit" -> "hot" -> "dot" -> "dog" -> "cog"
,
return its length5
.Note:
- Return 0 if there is no such transformation sequence.
- All words have the same length.
- All words contain only lowercase alphabetic characters.
方法
使用BFS进行遍历,但是当数据量很大的时候超时。使用的技巧:将string中的每一个char从a到z进行替换,判断替换后的是否在dict中。private boolean oneLetter(String str1, String str2) { int count = 0; for (int i = 0; i <str1.length(); i++) { if (str1.charAt(i) != str2.charAt(i)) { count++; } } return count == 1; } public int ladderLength(String start, String end, Set<String> dict) { if (start == null || start == null || start.length() != end.length()) { return 0; } if (start.equals(end)) { return 1; } if (oneLetter(start, end)) { return 2; } Map<String, Integer> hasFind = new HashMap<String, Integer>(); Queue<String> queue = new LinkedList<String>(); queue.offer(start); hasFind.put(start, 1); while (!queue.isEmpty()) { String str = queue.poll(); int count = hasFind.get(str); for (int i = 0; i < str.length(); i++) { for (char k = 'a'; k < 'z'; k++) { if (str.charAt(i) != k) { StringBuilder builder = new StringBuilder(str); builder.setCharAt(i, k); String temp = builder.toString(); if (temp.equals(end)) { return count + 1; } if (dict.contains(temp) && !hasFind.containsKey(temp)) { queue.offer(temp); hasFind.put(temp, count + 1); } } } } } return 0; }