单词接龙
2020年11月5日
题目来源:力扣
解题
一开始使用DFS进行深度遍历,发现进进出出的太花时间,且做出来之后超时了。
改用BFS进行遍历,逐层进行搜索,这里是一个图的结构了,且是双向图
思路来自这
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
//广度遍历
//先把列表转成集合
Set<String> wordSet=new HashSet<>(wordList);
//走过的字符串集合
Set<String> visited=new HashSet<>();
//建立一个队列,做广度遍历
Queue<String> queue=new LinkedList<>();
queue.add(beginWord);
//单词字符串长度
int wordLen=beginWord.length();
//初始步数
int step=1;
while(!queue.isEmpty()){
int len=queue.size();
//一个个拿出队列中现有的字符串,逐层往后推
for(int i=0;i<len;i++){
//转成字符串数组
char[] tmp=queue.poll().toCharArray();
//改动字符串的每一位字符
for(int j=0;j<wordLen;j++){
//先记录下原字符
char beforeCh=tmp[j];
for(char z='a';z<='z';z++){
//如果与当前字符相等,跳过
if(beforeCh==z) continue;
//不相同就进行比较
tmp[j]=z;
//把字符串数组转成字符串
String tmpString=String.valueOf(tmp);
//看看哈希集合里有没有,也看看有没有遍历过
if(wordSet.contains(tmpString) && !visited.contains(tmpString)){
//看看跟最终字符串是不是一样的
if(tmpString.equals(endWord)){
return step+1;
}
queue.add(tmpString);
visited.add(tmpString);
}
}
//改回去
tmp[j]=beforeCh;
}
}
step++;
}
return 0;
}
}