C语言力扣刷题1——最长回文字串[双指针]

力扣算题1——最长回文字串[双指针]

  • 一、博客声明
  • 二、题目描述
  • 三、解题思路
    • 1、思路说明
    • 2、知识补充
      • a、malloc动态内存分配
      • b、free释放内存
      • c、strlen求字符数组长度
      • d、strncpy函数
  • 四、解题代码(附注释)

一、博客声明

  找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来记录。代码可能不是自己写的,更多的是理解大佬们的解题思路。


二、题目描述

给你一个字符串 s,找到 s 中最长的回文子串。示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd"
输出:"bb"提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成

三、解题思路

1、思路说明

  这题主要使用双指针的方法来解决,以回文字的中间位置为突破口,让这两个指针在循环的时候朝着相对的方向移动,给定相应的判断条件来解决问题需求。在过程中求得最大回文字的长度以及第一个字在数组中的位置,最后用strncpy函数来返回目标回文字。

  第一种情况: 如果数组的长度小于等于1,则直接返回原来的数组就可以了

  第二种情况: 如果数组的长度大于1,则如下图,先用for循环遍历整个数组,在遍历数组中每个元素的时候用left和right对向移动,并同时用while循环判断s[left]s[right]是否相等,若相等left--right--。从对上申请两个int大小的内存,用于每次while结束后存储回文字的长度right - left - 1,以及第一个字在数组中的位置left + 1。在这种情况下,我们还需要考虑回文字长度是奇数还是偶数,如果是奇数的话,我们可以设置初始值left=right=i;若为偶数,则可以left=i,right=i+1。用len1记录奇数情况len2记录偶数情况。求最大的len作为最终结果。
在这里插入图片描述

2、知识补充

a、malloc动态内存分配

  malloc命令是从“堆”上面申请内存,内存是匿名的,类型和大小需要自己指定,返回的是指针(首指针,相当于数组第一个元素对应的地址)。申请地址的写法如下:

//从堆申请了2个int大小的内存,并把首地址给ret
int* ret = malloc(sizeof(int) * 2); 

b、free释放内存

  堆上面的内存大小是固定的,用完就没了,如果此时程序没有结束的话就会报错,即内存泄漏导致的溢出。这在对一些堆内容不大的嵌入式设备上编写程序时,需要特别注意。这时候就在代码末尾释放掉申请的内存就可以。比如释放上面申请的ret可以在代码末尾加上free(ret);。子函数中要返回申请的堆内容的话,是不用释放的,在主函数释放对应的返回值就可以了。

c、strlen求字符数组长度

  c语言中有一些命令可以快捷的用于开发,strlen(char*)可以用来就一个字符数组的大小,只能求字符数组的大小,当然字符串也是字符数组。因此,题目所给的字符数组便可以用该命令来获取数组大小。

//获取字符数组的大小
int s_len = strlen(s);

d、strncpy函数

  该函数的全部描述为:char *strncpy(char *dest, const char *src, size_t n)把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。当我们知道最长回文字串的首地址和长度之后,就可以用这个库函数将其取出,进行return


四、解题代码(附注释)

//返回值为ret指针,ret[0]是回文字长度,ret[1]是首个字在s数组中的位置
int* lenOfPalindrome(char* s, int left, int right){int L = left, R = right;int* ret = malloc(sizeof(int)*2);while(L >= 0 && R <= strlen(s) - 1 && s[L] == s[R]){L--;R++;}ret[0] = R - L - 1;//之所以是这样,是因为while循环是先判断后处理,L多减了1,R多加了1ret[1] = L + 1;//之所以是这样,是因为while循环是先判断后处理,L多减了1return ret;
}char* longestPalindrome(char* s) {if(strlen(s) <= 1) return s;//长度小于等于1,直接返回int* len = NULL;for(int i = 0; i < strlen(s) - 1; i++){int* len1 = lenOfPalindrome(s, i, i);//奇数情况int* len2 = lenOfPalindrome(s, i, i+1);//偶数情况if(len == NULL || len1[0] > len[0]){free(len);len = len1;} else {free(len1);}if(len == NULL || len2[0] > len[0]){free(len);len = len2;} else {free(len2);}}char* result = malloc(sizeof(char) * (len[0] + 1));//要多算一个结束符号位置result = strncpy(result, s + len[1], len[0]);result[len[0]] = '\0';//要加上结束符free(len);return result;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker配置远程连接

前置条件&#xff1a;docker所在的服务器开放2375端口 文件&#xff1a;/usr/lib/systemd/system/docker.service 节点ExecStart 追加 -H tcp://0.0.0.0:2375

智慧校园变革之路:全平台综合概述与最佳实践

在当今信息化浪潮的推动下&#xff0c;"智慧校园"作为教育创新的前沿阵地&#xff0c;正逐步揭开其神秘面纱&#xff0c;引领一场前所未有的教育转型革命。它远超过单纯技术叠加的传统框架&#xff0c;而是深度融合云计算、大数据、物联网等前沿科技&#xff0c;精心…

【计算机毕业设计】基于Springboot的智能物流管理系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

【Mac】Auto Mouse Click for Mac(高效、稳定的鼠标连点器软件)软件介绍

软件介绍 Auto Mouse Click for Mac 是一款专为 macOS 平台设计的自动鼠标点击软件&#xff0c;它可以帮助用户自动化重复的鼠标点击操作&#xff0c;从而提高工作效率。以下是这款软件的主要特点和功能&#xff1a; 1.自动化点击操作&#xff1a;Auto Mouse Click 允许用户录…

等保测评过程中会用到哪些工具或服务

等保测评工具和服务概述 等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是一项重要的信息安全工作&#xff0c;它涉及信息系统的技术和管理两个方面&#xff0c;包括物理安全、网络安全、主机安全、应用安全、数据安全等多个维度。等保测评工具和服务是企业进行信息…

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式&#xff0c;求出各个权重大小 loss函数是找最小值的&#xff0c;要求导&#xff0c;在计算机里面计算导数是倒着来的&#xff0c;所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

使用Llama3/Qwen2等开源大模型,部署团队私有化Code Copilot和使用教程

目前市面上有不少基于大模型的 Code Copilot 产品&#xff0c;部分产品对于个人开发者来说可免费使用&#xff0c;比如阿里的通义灵码、百度的文心快码等。这些免费的产品均通过 API 的方式提供服务&#xff0c;因此调用时均必须联网、同时需要把代码、提示词等内容作为 API 的…

面了英伟达算法岗,被疯狂拷打。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

Python逻辑控制语句 之 循环语句--for循环

1.for 的介绍 for 循环 也称为是 for 遍历, 也可以做指定次数的循环遍历: 是从容器中将数据逐个取出的过程.容器: 字符串/列表/元组/字典 2.for 的语法 &#xff08;1&#xff09;for 循环遍历字符串 for 变量 in 字符串: 重复执⾏的代码 字符串中存在多少个字符, 代码就执行…

YOLOv8 的简介 及C#中如何简单应用YOLOv8

YOLOv8 是 YOLO&#xff08;You Only Look Once&#xff09;系列中的最新版本&#xff0c;是一种用于目标检测和图像分割的深度学习模型。YOLO模型以其快速和准确的目标检测性能而著称&#xff0c;广泛应用于实时应用程序中。 主要特点 高效性&#xff1a;YOLOv8 在保持高检测…

【HBZ分享】如何实现系统的高可用

如何实现系统的高可用&#xff1f; 高可用架构设计 采用集群&#xff0c;多机房&#xff0c;多副本&#xff0c;负载均衡&#xff0c;热备份等手段&#xff0c;确保系统冗余 与 可恢复能力&#xff0c;避免单点故障。服务容错 与 降级 面对故障时&#xff0c;通常采用合适的…

解决java中时间参数的问题

在java的日常开发中&#xff0c;我们经常需要去接收前端传递过来的时间字符串&#xff0c;同时给前端返回数据时&#xff0c;也会涉及到时间字段的数据传递&#xff0c;那么我们要如何处理这些字段呢&#xff1f; 知识铺垫&#xff1a;java最后返回的时间是时间世界&#xff0…

鲁工小装载机-前后桥传动轴油封更换记录

鲁工装载机 因前后桥大量漏齿轮油&#xff0c;故拆开查看、更换油封 一&#xff1a; 如图圈起来的地方是螺丝和钢板相别&#xff0c;用200的焊接电流用电焊机点开一个豁口后拆除螺丝。 转轴是拆除传动轴后的样子。 这就是拆下来的样子&#xff0c;这玩意插上边那图&…

Python 3 字符串

Python 3 字符串 字符串在Python中是一种基本的数据类型,用于存储文本数据。Python 3中的字符串是由Unicode字符组成的序列,这使得它可以轻松地处理多种语言的文本。在本文中,我们将深入探讨Python 3中字符串的各个方面,包括创建字符串、字符串操作、格式化和常见的方法。…

F12开发者工具怎么用(小白版)

F12开发者工具&#xff08;也称为浏览器开发者工具&#xff09;是现代浏览器&#xff08;如Chrome、Firefox、Edge等&#xff09;内置的工具集&#xff0c;主要用于网页开发和调试。以下是使用这些工具的一些基本指南&#xff1a; 打开开发者工具 按下 F12 键&#xff0c;或者…

探索Scala在大数据开发中的高级功能

目录 2. Scala的语言特性 2.1 静态类型和类型推断 2.2 面向对象与函数式编程 3. 高级集合操作 3.1 不可变集合 3.2 高阶函数 4. 并发与并行处理 4.1 Future与Promise 4.2 Akka Actor模型 5. Spark与Scala的结合 5.1 RDD和DataFrame 5.2 Spark SQL与数据处理 6. 高…

八爪鱼现金流-033,升级日志,里程碑4

2024年6月30日15:48:46 v-4.0.0 定时任务发送邮件提醒功能开发&#xff1a; 发送邮箱定时任务。提醒月报记账. 工资日 5号 15号 25号 晚上17:30发送 里程碑版本4完成。 八爪鱼现金流 八爪鱼

【论文阅读】A Survey on Large Language Model based Autonomous Agents

文章目录 1 大语言模型的构建1.1分析模块 profiling module1.2 记忆模块 memory module1.2.1 记忆结构1.2.2 记忆形式1.2.3 记忆运行 1.3 规划模块 planning module1.3.1 无反馈规划1.3.2 有反馈计划 1.4 执行模块 action module1.4.1 执行目标1.4.2 执行空间 2 Agent能力提升2…

深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径

文章目录 一、分批渲染1、setTimeout定时器分批渲染2、使用requestAnimationFrame()改进渲染2.1、什么是requestAnimationFrame2.2、为什么使用requestAnimationFrame而不是setTimeout或setInterval2.3、requestAnimationFrame的优势和适用场景 二、滚动触底加载数据三、Elemen…

深入探索Edge浏览器中的WebAssembly:启用与禁用指南

WebAssembly&#xff08;简称Wasm&#xff09;是一种新的代码格式&#xff0c;旨在提供一种在现代浏览器中高效运行接近原生性能的应用程序的方式。微软Edge浏览器作为支持WebAssembly的浏览器之一&#xff0c;允许用户根据需要启用或禁用这项技术。本文将详细介绍如何在Edge浏…