- 🙂 第一次练习 2020年4月1日 目测这是一道掉头发的题,我丢.....
- 😄 第二次练习
# BFS 广度优先搜索
解题代码
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
int end = wordList.indexOf(endWord);
if (end == -1) {
return 0;
}
wordList.add(beginWord);
int start = wordList.size() - 1;
// 用于BFS遍历的队列
Queue<Integer> queue1 = new LinkedList<>();
Queue<Integer> queue2 = new LinkedList<>();
// 用于保存已访问的单词
Set<Integer> visited1 = new HashSet<>();
Set<Integer> visited2 = new HashSet<>();
queue1.offer(start);
queue2.offer(end);
visited1.add(start);
visited2.add(end);
int count1 = 0;
int count2 = 0;
while (!queue1.isEmpty() && !queue2.isEmpty()) {
count1++;
int size1 = queue1.size();
while (size1-- > 0) {
String s = wordList.get(queue1.poll());
for (int i = 0; i < wordList.size(); ++i) {
if (visited1.contains(i)) {
continue;
}
if (!canConvert(s, wordList.get(i))) {
continue;
}
if (visited2.contains(i)) {
return count1 + count2 + 1;
}
visited1.add(i);
queue1.offer(i);
}
}
count2++;
int size2 = queue2.size();
while (size2-- > 0) {
String s = wordList.get(queue2.poll());
for (int i = 0; i < wordList.size(); ++i) {
if (visited2.contains(i)) {
continue;
}
if (!canConvert(s, wordList.get(i))) {
continue;
}
if (visited1.contains(i)) {
return count1 + count2 + 1;
}
visited2.add(i);
queue2.offer(i);
}
}
}
return 0;
}
public boolean canConvert(String a, String b) {
int count = 0;
for (int i = 0; i < a.length(); ++i) {
if (a.charAt(i) != b.charAt(i)) {
if (++count > 1) return false;
}
}
return count == 1;
}
}
# 易错点
- 易错项 1