整理不易留个小心心呗🥰
如果有更好的或者是我有错的地方还请各位大佬指出哦
有些是copy的还望不要介意
单词接龙
题目描述:
字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk:
每一对相邻的单词只差一个字母。
对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
sk == endWord
给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。
示例:
输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
-
广度优先遍历

class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
//将字典存放在哈希表中,便于查询某个单词是否存在
Set<String> wordSet = new HashSet<>(wordList);
if(wordSet.size() == 0 || !wordSet.contains(endWord)){
return 0;
}
wordSet.remove(beginWord);
//广度优先遍历,利用队列以及存储是否访问过的哈希表
Queue<String> queue = new LinkedList<>();
queue.offer(beginWord);
Set<String> visited = new HashSet<>();
visited.add(beginWord);
//起点步数为1
int step = 1;
while(!queue.isEmpty()){
int currentSize = queue.size();
//遍历当前队列的元素
for(int i=0;i<currentSize;i++){
String currentWord = queue.poll();
//如果currentWord修改一个字符后与endWord相同,则返回步数+1
if(changeWordEveryOneLetter(currentWord,endWord,queue,visited,wordSet)){
return step+1;
}
}
step++;
}
return 0;
}
/**
*修改每个字符,是否跟endWord匹配
*/
private boolean changeWordEveryOneLetter(String currentWord,String endWord,Queue<String> queue,Set<String> visited,Set<String> wordSet){
char[] charArray = currentWord.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 nextWord = String.valueOf(charArray);
if(wordSet.contains(nextWord)){
if(nextWord.equals(endWord)){
return true;
}
if(!visited.contains(nextWord)){
queue.add(nextWord);
//标记访问过
visited.add(nextWord);
}
}
}
charArray[i] = originChar;
}
return false;
}
}
- 双向广度优先遍历
class Solution {
public int ladderLength(String beginWord, String endWord, List<String> wordList) {
//将字典存放在哈希表中,便于查询某个单词是否存在
Set<String> wordSet = new HashSet<>(wordList);
if(wordSet.size() == 0 || !wordSet.contains(endWord)){
return 0;
}
//将已经访问过的元素放入visited
Set<String> visited = new HashSet<>();
//分别用左边和右边扩散的哈希表代替单向BFS里的队列

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



