思路
隐式图BFS,每一个状态看作图中的每个节点。从起点开始BFS的同时记录level层数,方便返回结果。
复杂度
时间复杂度为
O
(
n
∗
2
6
l
)
O(n*26^l)
O(n∗26l)
空间复杂度为
O
(
n
)
O(n)
O(n)
其中,n为字典大小,l为每个单词的长度
代码
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) {
// write your code here
HashMap<String, Integer> level = new HashMap<>();
level.put(start, 1);
Set<String> visit = new HashSet<>();
Queue<String> queue = new LinkedList<>();
queue.add(start);
visit.add(start);
while (!queue.isEmpty()) {
String t = queue.poll();
List<String> nextList = getNext(t);
for (String next : nextList) {
if (!visit.contains(next)) {
level.put(next, level.get(t) + 1);
if (next.equals(end)) {
return level.get(end);
}
if (dict.contains(next)) {
queue.add(next);
visit.add(next);
}
}
}
}
return 0;
}
private List<String> getNext(String cur) {
char[] curArray = cur.toCharArray();
List<String> res = new ArrayList<>();
for (int i = 0; i < curArray.length; i++) {
for (char c = 'a'; c <= 'z'; c++) {
char t = curArray[i];
curArray[i] = c;
String next = String.valueOf(curArray);
res.add(next);
curArray[i] = t;
}
}
return res;
}
}