文章目录

  • 1. 题目
  • 2. 图的BFS解题
    • 2.1 单向BFS
    • 2.2 双向BFS !厉害了

1. 题目

给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度
转换需遵循如下规则:

  • 每次转换只能改变一个字母。
  • 转换过程中的中间单词必须是字典中的单词。

说明:
如果不存在这样的转换序列,返回 0。
所有单词具有相同的长度。
所有单词只由小写字母组成。
字典中不存在重复的单词。
你可以假设 beginWord 和 endWord 是非空的,且二者不相同。

示例 1:
输入:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
输出: 5
解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",返回它的长度 5。示例 2:
输入:
beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]
输出: 0
解释: endWord "cog" 不在字典中,所以无法进行转换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-ladder
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 图的BFS解题

题目有点恶心的地方在于,beginWord不知道是不是在list内,需要判断
类似题目:
程序员面试金典 - 面试题 17.22. 单词转换(BFS)
LeetCode 126. 单词接龙 II(图的BFS)

2.1 单向BFS

  • 利用队列进行BFS
class Solution {public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {int len = wordList.size(), i, k, n, lv = 0;unordered_map<string,int> m;bool visited[len] = {false};for(i = 0; i < len; ++i){m[wordList[i]] = i;if(wordList[i] == beginWord)visited[i] = true;}if(m.find(endWord) == m.end())return 0;queue<string> q;string str;q.push(beginWord);while(!q.empty()){lv++;n = q.size();while(n--){for(i = 0; i < beginWord.size(); ++i){//对每个单词的每个字符进行改变str = q.front();for(k = 1; k <= 25; ++k){str[i] += 1;if(str[i] > 'z')str[i] = 'a';if(m.find(str) != m.end() && !visited[m[str]]){  //在集合中,且没有访问的q.push(str);visited[m[str]] = true;if(str == endWord)return lv+1;}}}q.pop();}}return 0;}
};

2.2 双向BFS !厉害了

  • 从起始和终点分别开始BFS,2个队列
  • visited 存储int值,初始化为0,正向访问了+1,反向访问了+2,如果某个visited的值为3,说明都访问到了(连通了)
  • 每次选择队列较短的一端继续BFS(减少队列扩大的规模,提高效率)
class Solution {public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {int len = wordList.size(), wlen = beginWord.size(), i, k, n, n1, n2, flag, lv = 0;unordered_map<string,int> m;vector<int> visited(len,0);bool beginWordInList = false;for(i = 0; i < len; ++i){m[wordList[i]] = i;if(wordList[i] == beginWord)//判断beginWord在List中否{visited[i] = 1;//beginWord正向访问beginWordInList = true;}}if(!beginWordInList)//beginWord不在list中{visited.push_back(1);//添加起点正向访问,值为1m[beginWord] = len;//哈希表添加}if(m.find(endWord) == m.end())return 0;queue<string> q1, q2;string str;q1.push(beginWord);q2.push(endWord);visited[m[endWord]] = 2;//终点反向访问了,值为2while(!q1.empty() && !q2.empty()){lv++;//走的步数n1 = q1.size();n2 = q2.size();queue<string> &Q = n1<n2 ? q1 : q2;//Q是较短的队列的引用flag = n1<n2 ? 1 : 2;//访问后增加的值n = Q.size();while(n--){for(i = 0; i < wlen; ++i){str = Q.front();for(k = 1; k <= 25; ++k){str[i] += 1;if(str[i] > 'z')str[i] = 'a';if(m.find(str) != m.end() && visited[m[str]] != flag){    //不等于1说明正向没有访问,不等于2说明反向没有访问Q.push(str);visited[m[str]] += flag;if(visited[m[str]] == 3)//等于3说明,双向访问过,找到路径return lv+1;}}}Q.pop();}}return 0;}
};

LeetCode 127. 单词接龙(图的BFS/双向BFS)相关推荐

  1. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  2. leetcode 127. 单词接龙(bfs)

    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...

  3. LeetCode 127. 单词接龙(C++)*

    思路: 1.如果采用回溯法来的话会超时: 2.这里采用构造图和广度优先遍历结合来实现:首先要构造图,需要将每个字符串对应一个数字id,然后边的构造使用矩阵来实现,这里采用将每一个字符串的id连接每个将 ...

  4. LeetCode 127. 单词接龙(广度优先遍历)

    题目描述 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换 ...

  5. leetcode 127 单词接龙

    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...

  6. Leetcode 127. 单词接龙 解题思路及C++实现

    解题思路: 首先判断wordList中是否有endWord,如果没有,就返回0. pathCount用来存储beginWord转换到某一个word所需的长度,有点类似于动态规划中用于记录状态的矩阵. ...

  7. leetcode 127 单词接龙

    思路:BST 方向 :{a,b,c.......z} 设置一个queue ,记录当前位置 先是外层循环(queue !=  null)   如果 这个循环走完, 说明中间没返回, 直接返回0: 每一次 ...

  8. LeetCode 126. 单词接龙 II(图的BFS)

    1. 题目 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列. 转换需遵循如下规则: 每次转换只能 ...

  9. LeetCode:127 单词接龙 无向图BFS

    LeetCode:127 单词接龙 无向图BFS 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下 ...

最新文章

  1. 【采用】无监督学习在反欺诈中的应用
  2. Redis 6.0 新特性,多线程连环 13 问!
  3. 命令行下的curl使用详解
  4. 201. Bitwise AND of Numbers Range
  5. JAVA 向文本文件中换行插入字符
  6. JVM运行时内存概念-堆栈及新生代、老年代、持久代
  7. ASP.NET 实现上传EXCEL,利用NOPI操作,转换得到DataTable
  8. SPSS T检验(图文+数据集)【SPSS 017期】
  9. java基础学习(4)
  10. matlab中常用符号
  11. 转载-【常用RGB颜色查询对照表及感情色】
  12. 解决安装软件时出现的error1723,以安装破解版Endnote X9为例(附资源)
  13. linux-ext4格式文件误删除恢复
  14. 步进电机基础及工作原理
  15. OrCAD Capture原理图中批量修改网络名
  16. 设置android应用闪屏图片_android 闪屏设计
  17. BZOJ3168: [Heoi2013]钙铁锌硒维生素
  18. Android字体加粗的几种样式
  19. python 获取当前网页_你好,想知道python scrapy 如何获取当前页面url?
  20. 数据结构之堆(Heap)的实现

热门文章

  1. 制作已编译的html帮助文件
  2. 汇编指令的学习4——ldm/stm指令、栈的处理
  3. jmeter强大的扩展插件!!
  4. tornado框架基础11-tornado异步
  5. odoo基础数据加载
  6. 学习大数据看门的几本书
  7. '[linux下tomcat 配置
  8. Nginx + PHP(php-fpm)遇到的502 Bad Gateway错误
  9. 浅析调用android的content provider(一)
  10. session过期后登陆页面跳出iframe页面问题