package com.tuling.algomiter.bfs;
import java.util.*;
/**
* Author: sl
* date: 2022/11/1
* time: 1:31 下午
*/
public class wordLadder_127 {
public static void main(String[] args) {
String start = "hit";
String end = "cog";
List<String> worldList = new ArrayList<>();
worldList.add("hot");
worldList.add("dot");
worldList.add("dog");
worldList.add("lot");
worldList.add("log");
worldList.add("cog");
System.out.println(new wordLadder_127().ladderLength(start, end, worldList));
}
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
// 创建set 方便获取值
Set<String> worldDic = new HashSet<>(wordList);
if (wordList.size() == 0 || !worldDic.contains(endWord)){
return 0;
}
// 移除开始的
worldDic.remove(beginWord);
//初始化队列
Queue<String> queue = new LinkedList<>();
queue.offer(beginWord);
// 记录访问过的单词
Set<String> visited = new HashSet<>();
visited.add(beginWord);
// 队列不为空开始循环
int step = 1;
while (!queue.isEmpty()){
// 获取队列大小
int currentSize = queue.size();
for (int i = 0;i < currentSize;i++){
// 取出当前循环的单词
String currentWorld = queue.poll();
if (changeOneWorld(currentWorld,endWord,queue,visited,worldDic)){
return step + 1;
}
}
step++;
}
return 0;
}
private boolean changeOneWorld(String currentWorld, String endWord, Queue<String> queue, Set<String> visited, Set<String> worldDic) {
// 转换成char 型数组
char[] charArray = currentWorld.toCharArray();
// 每次只改变其中一个字符 循环开始修改字符
for (int i = 0; i < endWord.length(); i++) {
// 获取修改前的字符
char originChar = charArray[i];
// 开始修改单个字符
for (char k = 'a';k < 'z';k++){
// 是自己跳过
if (k == originChar){
continue;
}
// 修改单个字符
charArray[i] = k;
// 重新转换为 String
String newWorld = String.valueOf(charArray);
// 新组合符合条件
if (worldDic.contains(newWorld)){
// 结束循环条件
if (newWorld.equals(endWord)){
return true;
}
// 符合条件的情况
if (!visited.contains(newWorld)){
queue.add(newWorld);
visited.add(newWorld);
}
}
}
// 恢复
charArray[i] = originChar;
}
return false;
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交