C语言 | Leetcode C语言题解之第126题单词接龙II

题目:

题解:

char** list;
int** back;
int* backSize;

// DFS uses backtrack information to construct results
void dfs(char*** res, int* rSize, int** rCSizes, int* ans, int last, int retlevel) {
   int i = ans[last];
   if (i == 0) {
       res[*rSize] = (char**)malloc(sizeof(char*) * retlevel);
       (*rCSizes)[*rSize] = retlevel;
       for (int j = 0; j < retlevel; ++j) {
           res[*rSize][j] = list[ans[j]];
       }
       ++(*rSize);
   }
   if (last == 0) return;
   for (int j = 0; j < backSize[i]; ++j) {
       int k = back[i][j];
       ans[last - 1] = k;
       dfs(res, rSize, rCSizes, ans, last - 1, retlevel);
   }
}

char*** findLadders(char* beginWord, char* endWord, char** wordList, int wordListSize, int* returnSize, int** returnColumnSizes) {
   *returnSize = 0;
   int size = wordListSize + 1;  // new size
   int wlen = strlen(beginWord);
   list = (char**)malloc(sizeof(char*) * size);  // new wordlist
   back = (int**)malloc(sizeof(int*) * size);    // data to backtrack indexes while BFS
   backSize = (int*)malloc(sizeof(int) * size);
   int* visited = (int*)malloc(sizeof(int) * size);  // visited flag in BFS
   int** diff = (int**)malloc(sizeof(int*) * size);  // list diff[i] are indexes which can connect to word[i]
   int* diffSize = (int*)malloc(sizeof(int) * size);
   int endidx = 0;
   // Intialization 1
   for (int i = 0; i < size; ++i) {
       list[i] = i == 0 ? beginWord : wordList[i - 1];
       visited[i] = 0;
       diff[i] = (int*)malloc(sizeof(int) * size);
       diffSize[i] = 0;
       back[i] = (int*)malloc(sizeof(int) * size);
       backSize[i] = 0;
       if (strcmp(endWord, list[i]) == 0) {
           endidx = i;
       }
   }
   if (endidx == 0) return 0;  // endword is not in the list
   // collect diff data
   for (int i = 0; i < size; ++i) {
       for (int j = i; j < size; ++j) {
           int tmp = 0;  // tmp is the difference between word[i] & word[j]
           for (int k = 0; k < wlen; ++k) {
               tmp += list[i][k] != list[j][k];
               if (tmp > 1) break;
           }
           if (tmp == 1) {
               diff[i][diffSize[i]++] = j;
               diff[j][diffSize[j]++] = i;
           }
       }
   }
   // BFS
   int* curr = (int*)malloc(sizeof(int) * size);  // curr level in BFS
   int* prev = (int*)malloc(sizeof(int) * size);  // prev level in BFS
   int prevSize, currSize = 1;
   int* currvisited = (int*)malloc(sizeof(int) * size);  // to make sure curr members are unique
   int level = 1;                                        // level of ladder
   curr[0] = 0;
   visited[0] = 1;
   int retlevel = 0;  // ladder size, marks the end of BFS
   while (retlevel == 0 && currSize > 0) {
       ++level;
       // switch prev and curr
       int* tmp = prev;
       prev = curr;
       curr = tmp;
       prevSize = currSize;
       currSize = 0;
       // reset currvisited for each level curr
       for (int i = 0; i < size; ++i) {
           currvisited[i] = 0;
       }
       for (int i = 0; i < prevSize; ++i) {
           for (int j = 0; j < diffSize[prev[i]]; ++j) {
               int k = diff[prev[i]][j];  // k is the candidate of curr (next level of BFS)
               if (visited[k]) continue;
               back[k][backSize[k]++] = prev[i];   // backtrack
               if (k == endidx) retlevel = level;  // find the lowest ladder level, finish current BFS
               if (currvisited[k]) continue;       // no duplicates in curr list
               curr[currSize++] = k;
               currvisited[k] = 1;
           }
       }
       // set visited after search through one level, different from Q127
       for (int i = 0; i < currSize; ++i) {
           visited[curr[i]] = 1;
       }
   }
   if (retlevel == 0) return 0;  // no ladder found
   // DFS to construct result
   char*** res = (char***)malloc(sizeof(char**) * size);
   int* ans = (int*)malloc(sizeof(int) * retlevel);
   *returnColumnSizes = (int*)malloc(sizeof(int) * size);
   ans[retlevel - 1] = endidx;
   dfs(res, returnSize, returnColumnSizes, ans, retlevel - 1, retlevel);
   return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/670433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DALL·E 2详解:人工智能如何将您的想象力变为现实!

引言 DALLE 2是一个基于人工智能的图像生成模型&#xff0c;它通过理解自然语言描述来生成匹配这些描述的图像。这一模型的核心在于其创新的两阶段工作流程&#xff0c;首先是将文本描述转换为图像表示&#xff0c;然后是基于这个表示生成具体的图像。 下面详细介绍DALL-E2的功…

Vivado Design Suite一级物件

Vivado Design Suite一级物件 按设计过程导航内容 Xilinx文档围绕一组标准设计流程进行组织&#xff0c;以帮助您 查找当前开发任务的相关内容。本文件涵盖 以下设计过程&#xff1a; •硬件、IP和平台开发&#xff1a;为硬件创建PL IP块 平台&#xff0c;创建PL内核&#xff0…

HTML的标签(标题、段落、文本、图片、列表)

HTML的标签1 标题标签&#xff1a;段落标签&#xff1a;文本标签&#xff1a;图片标签:列表标签&#xff1a;有序列表&#xff1a;无序列表&#xff1a;定义列表&#xff1a;列表案例&#xff1a; 标题标签&#xff1a; 标签&#xff1a;h1~h6 注意&#xff1a;如果使用无效标…

C语言怎样写数据⽂件,使之可以在不同字⼤⼩、 字节顺序或浮点格式的机器上读⼊?

一、问题 怎样写数据⽂件&#xff0c;使之可以在不同字⼤⼩、字节顺序或浮点格式的机器上读⼊&#xff0c;也就是说怎样写⼀个可移植性好的数据⽂件&#xff1f; 二、解答 最好的移植⽅法是使⽤⽂本⽂件&#xff0c;它的每⼀字节放⼀个 ASCII 代码&#xff0c;代表⼀个字符。 …

从JS角度直观理解递归的本质

让我们写一个函数 pow(x, n)&#xff0c;它可以计算 x 的 n 次方。换句话说就是&#xff0c;x 乘以自身 n 次。 有两种实现方式。 迭代思路&#xff1a;使用 for 循环&#xff1a; function pow(x, n) {let result 1;// 在循环中&#xff0c;用 x 乘以 result n 次for (let i…

短时间内如何顺利通过 Java 面试?

今天我们来探讨一个重要的话题&#xff1a;短时间内如何顺利通过 Java 面试&#xff1f; 在此之前&#xff0c;我正在精心编写一套完全面向小白的 Java 自学教程&#xff0c;我相信这套教程会非常适合正在努力提升的你。教程里面涵盖了丰富全面的编程教学内容、详细生动的视频…

2.8Flowmap的实现

一、Flowmap 是什么 半条命2中水的流动 求生之路2中的水的流动 这种方式原理简单&#xff0c;容易实现&#xff0c;运算量少&#xff0c;如今也还在使用 1.flowmap的实质 Flow map(流向图) &#xff0c;一张记录了2D向量信息的纹理&#xff0c;Flow map上的颜色(通常为RG通道…

Python知识点14---被规定的资源

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 在Python中被规定的东西不止有常识中的那些关键字、构造器等编程语言…

Vue3-Ref Reactive toRef toRefs对比学习、标签ref与组件ref

响应式数据&#xff1a; Ref 作用&#xff1a;定义响应式变量。 语法&#xff1a;let xxx ref(初始值)(里面可以是任何规定内类型、数组等)。 返回值&#xff1a;一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的。 注意点&am…

公网如何访问内网?

公网和内网已经成为我们生活中不可或缺的存在。由于内网的安全性考虑&#xff0c;公网无法直接访问内网资源。如何实现公网访问内网呢&#xff1f;本文将介绍一种名为【天联】的私有通道技术&#xff0c;通过安全加密&#xff0c;保障数据传输的安全性。 【天联】私有通道技术 …

利用Python处理DAX多条件替换

小A&#xff1a;白茶&#xff0c;救命啊~~~ 白茶&#xff1a;什么情况&#xff1f; 小A&#xff1a;是这样的&#xff0c;最近不是临近项目上线嘛&#xff0c;有一大波度量值需要进行类似的调整&#xff0c;一个两个倒没啥&#xff0c;600多个&#xff0c;兄弟&#xff0c;救命…

STM32_FSMC_HAL(介绍)

FSMC&#xff08;Flexible Static Memory Controller&#xff09;是STM32微控制器中的一种内存控制器&#xff0c;它允许微控制器与外部存储器接口&#xff0c;如SRAM、NOR Flash、NAND Flash和PSRAM等。FSMC特别适用于需要高速数据交换和大量数据存储的应用场景。 典型应用&a…

06.持久化存储

6.持久化存储 pv: persistent volume 全局的资源 pv&#xff0c;node pvc: persistent volume claim 局部的资源&#xff08;namespace&#xff09;pod&#xff0c;rc&#xff0c;svc 6.1:安装nfs服务端(192.168.111.11) yum install nfs-utils.x86_64 -y mkdir /data vim /…

Linux——多线程(二)

在上一篇博客中我们已经介绍到了线程控制以及对应的函数调用接口&#xff0c;接下来要讲的是真正的多线程&#xff0c;线程安全、线程互斥、同步以及锁。 一、多线程 简单写个多线程的创建、等待的代码 #include<iostream> #include<pthread.h> #include<un…

【案例实操】银河麒麟桌面操作系统实例分享,V10SP1重启后网卡错乱解决方法

1.问题现象 8 个网口&#xff0c; 命名从 eth1 开始到 eth8。 目前在系统 grub 里面加了 net.ifnames0 biosdevname0 参数&#xff0c; 然后在 udev 规则中加了一条固定网卡和硬件 pci 设备号的规则文件。 最后在 rc.local 中加了两条重新安装网卡驱动的命令&#xff08; rmmod…

yolov10模块

yolov10模块 1 C2f2 C2fCIB2.1 CIB2.2 RepVGGDW 3 PSA4 SCDown5 v10Detect 论文代码&#xff1a;https://github.com/THU-MIG/yolov10 论文链接&#xff1a;https://arxiv.org/abs/2405.14458 Conv是Conv2dBNSiLU PW是Pointwise Convolution(逐点卷积) DW是Depthwise Convolut…

45页超干PPT:AGV技术详解

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 AGV&#xff08;Automated Guided Vehicle&#xf…

JVM的垃圾回收机制

目录 GC的工作范围 谁是垃圾 怎么判断&#xff0c;某个对象是否有引用指向捏&#xff1f; &#xff08;1&#xff09;引用计数 缺陷 释放垃圾的策略 &#xff08;1&#xff09;标记清除&#xff08;不实用&#xff09; &#xff08;2&#xff09;复制算法 &#xff08…

公网IP地址如何查询?

公网IP地址是指在互联网中可以被全球范围内的设备访问的IP地址。在网络通信中&#xff0c;公网IP地址扮演着重要的角色&#xff0c;它可以标识设备在互联网中的位置。查询公网IP地址是一种常见的网络管理需求&#xff0c;因为它能够提供网络设备的准确位置信息&#xff0c;方便…

首套真题解析!安徽211难度适中!两门课!

这个系列会分享名校真题。并做详细解析&#xff01;此为24年第一套&#xff01; 今天分享的是22年合肥工业856的信号与系统试题及解析。 小马哥Tips&#xff1a; 本套试卷难度分析&#xff1a;本套试题内容难度中等&#xff0c;里面较多的考察了信号与系统的知识&#xff0c…