• leetcode做题笔记127. 单词接龙


    字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk

    • 每一对相邻的单词只差一个字母。
    •  对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
    • sk == endWord

    给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

     思路一:BFS

    1. #define MAX_QUEUE_LEN 100000
    2. int isSequ(char* a, char* b){
    3. int len = strlen(a);
    4. int count = 0;
    5. for(int i = 0; i < len; i++){
    6. if(a[i] != b[i])
    7. count++;
    8. }
    9. if(count == 1)
    10. return true;
    11. else
    12. return false;
    13. }
    14. int ladderLength(char *beginWord, char *endWord, char **wordList, int wordListSize)
    15. {
    16. char* queueList[MAX_QUEUE_LEN] = {0}; //定义一个很大的数组,用来当做队列
    17. int head = 0; //需要首尾指针标记
    18. int tail = 0;
    19. for(int i = 0; i < wordListSize; i++){
    20. if(strcmp(endWord, wordList[i]) == 0){ //字符串中有可以匹配的
    21. break;
    22. }
    23. if(i == wordListSize-1) return 0; //字符串数组中没有匹配的,return 0
    24. }
    25. int* mark = (int*)malloc(wordListSize*sizeof(int)); //需要标识这个字符串是否已经遍历过了,避免死循环
    26. memset(mark, 0, wordListSize * sizeof(int));
    27. queueList[tail++] = beginWord; //初始,起始字符串入队列,尾指针+1
    28. int step = 1;
    29. while(head != tail){ //队列不为空,遍历未结束
    30. int scop = tail-head; //广度搜索,当前这一层有多少个
    31. for(int i = 0; i < scop; i++){
    32. char *temp = queueList[head++];
    33. if(strcmp(temp, endWord) == 0){ //相当于出队列,判断是否符合。首指针++
    34. free(mark);
    35. return step;
    36. }
    37. for(int j = 0; j < wordListSize; j++){ //相当于搜索下一层,查是否存在可以变化的
    38. if(mark[j] == 0 && isSequ(temp, wordList[j])){
    39. mark[j] = 1;
    40. queueList[tail++] = wordList[j];
    41. }
    42. }
    43. }
    44. step++;
    45. }
    46. free(mark);
    47. return 0;
    48. }

    分析:

    本题要将返回最短转换序列的数目,可以采用广度优先搜索和队列解决问题,将字符存入队列,不断判断队列中结尾字符是否符合,不断使用isSequ函数进行判断。最后返回最短转换序列数

    总结:

    本题考察广度优先搜索的引用,由于判断最后一位的过程和队列的特点比较符合,故采用队列记录字符串经判断后输出最短转换序列数。

  • 相关阅读:
    玻色量子入选2022年北京市科协“企业创新联合体”建设支持名单
    C++ 字符串用法大全
    iOS 列表页面实时刷新解决方案
    解决卸载node升级到node12版本后踩坑sass-loader和node-sass版本冲突的问题
    常见的C/C++开源非线性优化库
    2023-09-23 Windows系统rust开发环境配置真经
    IOS输入框聚焦会把内容区域顶起
    go语言学习-git代码管理
    【C++风云录】跨界开发:C++中集成和扩展动态语言的路线指南
    计算机保研英语常见问题
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/132724109