给定两个单词(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" 不在字典中,所以无法进行转换。

解题思路:
广度优先搜索,先判断字符数组中是否有endword,若没有则返回0,若有,则进行判断。
在字符数组中进行优先搜索,以数组模拟队列,先将beginword入队,再在字符数组中进行搜索,若搜索得到与beginword只有一个字符差别的字符串,则将该字符串入队,然后依次搜索入队的字符串,同样的搜索与之相差一个字符的字符串入队,直到搜索到endword为止。

代码实现:

#define maxsize 10000bool compare(char* a, char* b)      //定义一个比较函数,比较字符串a和b是否只有一个字符不同
{int i;int count = 0;for (i = 0; i < strlen(a); i++){if (a[i] != b[i]){count++;}}if (count == 1){return true;}else {return false;}
}int ladderLength(char * beginWord, char * endWord, char ** wordList, int wordListSize)
{char* Queue[maxsize] = {0};           //申请一个数组模拟队列int* visited = (int*)calloc(wordListSize, sizeof(int));    //定义辅助数组int head = 0;      //头指针int tail = 0;     //尾指针int deep = 1;     //保存最短路径for (int i = 0; i < wordListSize; i++)        //判断字符串数组中是否有目标字符串{if (strcmp(endWord, wordList[i]) == 0){break;}if (i == wordListSize - 1){return 0;}}Queue[tail++] = beginWord;        //入队while (head < tail)              //若队列不为空{int size = tail - head;       //当前层个数for (int j = 0; j < size; j++) //遍历当前层{char* cur = Queue[head++];   //首字符串出队if (strcmp(cur, endWord) == 0)    //若为目标字符串则返回结果{return deep;}for (int k = 0; k < wordListSize; k++)        //遍历字符串寻找与当前字符串相差一个字符的字符串,若没有遍历过,则入队{if (visited[k] == 0 && compare(cur, wordList[k])){visited[k] = 1;Queue[tail++] = wordList[k];}}}deep++;      //路径加一}     free(visited);return 0;
}

leetcode 127 单词接龙相关推荐

  1. LeetCode 127. 单词接龙(图的BFS/双向BFS)

    文章目录 1. 题目 2. 图的BFS解题 2.1 单向BFS 2.2 双向BFS !厉害了 1. 题目 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord ...

  2. Java实现 LeetCode 127 单词接龙

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

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

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

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

    给定两个单词(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. 急!!!求从字符串中提取形如: div([MC0010000000006],此若干个字符或数字,0) 的正则表达式...
  2. Promise从入门到精通
  3. php range第二个参数比第一个小,鲜为人知的 PHP range() 函数
  4. Fragment详解之二——基本使用方法
  5. redis和memcache的区别
  6. vim查找关键字_VIM学习笔记 对话框(Dialog)
  7. C语言 指针数组和数组指针区别 - C语言零基础入门教程
  8. php 实现跨站下载图片,一个图片url访问后直接下载怎样实现
  9. 资源放送丨《PostgreSQL中的锁》PPT视频
  10. python 内置模块random_Python3.5内置模块之random模块用法实例分析
  11. Linux下的wc命令
  12. python中时间的处理
  13. swoole实现Timer定时器、心跳检测及Task进阶实例:mysql连接池
  14. 2020-08-17每日一句
  15. 带时间轴的文章归档的html页面,Css打造伸缩时间轴样式的WordPress归档页面archive.php...
  16. BeAlert 一款alert和confirm美化插件(优化)
  17. jenkins插件管理提示“update information obtained
  18. JS中apply与call的用法
  19. java中打印大小写字母
  20. 数学149的女学霸,直言想当程序员!女生当程序员到底行不行?

热门文章

  1. 华为matebook x pro笔记本换硬盘实战
  2. 元宇宙六大技术,后续的技术趋势 !
  3. 什么?你还不知道怎么打造企业微信对外信息?
  4. 酪氨酸脱羧酶丨Worthington粪链球菌酪氨酸脱羧酶的特征
  5. Android UI 中如何利用表格进行布局
  6. 设计一个简易模糊查询输入框(上)
  7. 手机信号空中传输原理是什么
  8. 如何用c语言return数组函数
  9. github package的使用教程
  10. Python每天学习计划