以java语言为基础给出BFS算法的模板并结合leetcode给出实际用例
BFS算法模板:
public void bfs(int start, int end) {
Queue<Integer> queue = new LinkedList<>();
boolean[] visited = new boolean[n];
queue.offer(start);
visited[start] = true;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int cur = queue.poll();
if (cur == end) {
// 找到目标,做出相应处理
return;
}
for (int next : getNext(cur)) {
if (!visited[next]) {
queue.offer(next);
visited[next] = true;
}
}
}
}
// 队列为空,无法找到目标,做出相应处理
}
BFS算法的实际用例:
LeetCode 127. 单词接龙(中等)
题目描述:
给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需要遵循如下规则:
- 每次转换只能改变一个字母。
- 转换过程中的中间单词必须是字典中的单词。
说明:
- 如果不存在这样的转换序列,返回一个空列表。
- 所有单词具有相同的长度。
- 所有单词只由小写字母组成。
- 字典中不存在重复的单词。
- 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。
示例1:
输入:
beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:
[ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
示例2:
输入:
beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:
[]
解题思路:
本题可以使用BFS算法进行求解。我们可以把beginWord看做起点,endWord看做终点,然后使用BFS算法搜索从beginWord到endWord的最短路径。在搜索过程中,我们需要遵循如下规则:
- 每次转换只能改变一个字母。
- 转换过程中的中间单词必须是字典中的单词。
为了方便,我们可以把所有单词都看做一个点,如果两个单词可以通过一次转换得到,则它们之间有一条无向边。这样,我们就可以将整个问题转化为在一个无向图中求从起点到终点的最短路径了。
代码实现:
class Solution {
public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
// 将wordList转化为set
Set<String> wordSet = new HashSet<>(wordList);
// 如果endWord不在wordSet中,无法找到最短路径
if (!wordSet.contains(endWord)) {
return new ArrayList<>();
}
// 定义队列、visited数组和结果集
Queue<List<String>> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
List<List<String>> res = new ArrayList<>();
// 将起点加入队列和visited数组
List<String> list = new ArrayList<>();
list.add(beginWord);
queue.offer(list);
visited.add(beginWord);
// BFS搜索
boolean flag = false;
while (!queue.isEmpty()) {
int size = queue.size();
Set<String> subVisited = new HashSet<>();
for (int i = 0; i < size; i++) {
List<String> curList = queue.poll();
String curWord = curList.get(curList.size() - 1);
for (String nextWord : getNextWords(curWord, wordSet)) {
List<String> nextList = new ArrayList<>(curList);
nextList.add(nextWord);
if (nextWord.equals(endWord)) {
res.add(nextList);
flag = true;
}
if (!visited.contains(nextWord)) {
queue.offer(nextList);
subVisited.add(nextWord);
}
}
}
visited.addAll(subVisited);
if (flag) {
break;
}
}
return res;
}
private List<String> getNextWords(String word, Set<String> wordSet) {
List<String> res = new ArrayList<>();
char[] chs = word.toCharArray();
for (int i = 0; i < chs.length; i++) {
char oldCh = chs[i];
for (char ch = 'a'; ch <= 'z'; ch++) {
if (ch == oldCh) {
continue;
}
chs[i] = ch;
String nextWord = new String(chs);
if (wordSet.contains(nextWord)) {
res.add(nextWord);
}
}
chs[i] = oldCh;
}
return res;
}
}
``
原文地址: https://www.cveoy.top/t/topic/exOJ 著作权归作者所有。请勿转载和采集!