[LintCode]Word Ladder
public class Solution {
/**
* @param start, a string
* @param end, a string
* @param dict, a set of string
* @return an integer
*/
public int ladderLength(String start, String end, Set<String> dict) {
// 2015-08-28
if (start == null || end == null || dict == null) {
return -1;
}
if (start.equals(end)) {
return 1;
}
int count = 1;
Queue<String> queue = new ArrayDeque<String>();
queue.offer(start);
dict.remove(start); // 在dict中删去
while (!queue.isEmpty()) {
count++;
int queueLen = queue.size();
//关键:这层for循环的意义在区分树的层,不然没法做
for (int k = 0; k < queueLen; k++) {
String str = queue.poll();
for (int i = 0; i < str.length(); i++) {
for (char ch = 'a'; ch <= 'z'; ch++) {
String temp = replace(str, i, ch);
if (temp.equals(end)) {
return count; //找到
}
if (dict.contains(temp)) {
queue.offer(temp);
dict.remove(temp); //注意
}
}
}
}
}
return -1;
}
/**
* 换掉字符串中的某一个字节
*/
private String replace(String str, int pos, char ch) {
char[] chars = str.toCharArray();
chars[pos] = ch;
return new String(chars);
}
}