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

news2024/11/25 18:28:44

力扣算题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多加了1
    ret[1] = L + 1;//之所以是这样,是因为while循环是先判断后处理,L多减了1
    return 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.coloradmin.cn/o/1872208.html

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

相关文章

中小企业进行数字化转型会面临哪些挑战?

在当今这个信息化、数字化的时代&#xff0c;中小企业进行数字化转型已不再是选择&#xff0c;而是必然。然而&#xff0c;这条转型之路并非坦途&#xff0c;它充满了未知与挑战。今天&#xff0c;我们就来探讨一下中小企业为社么要进行数字化转型以及在数字化转型过程中可能遇…

solidworks钣金工厂共享云桌面方案

随着信息技术的飞速发展和企业数字化转型的深入&#xff0c;传统的钣金工厂面临着诸多挑战&#xff0c;其中之一就是如何在保证数据安全的前提下&#xff0c;提高设计、生产和管理的效率。 SolidWorks是一款专业的三维3D设计软件&#xff0c;功能强悍&#xff0c;支持分布式数…

OpenAI最强大模型ChatGPT-4o,论文降重小技巧,国内直接使用

一、万字论文&#xff0c;从0到1&#xff0c;只需1小时 通过OpenAI5月14日1点发布的最新大模型ChatGPT4o&#xff1a; 1小时即可完成万字论文的编写通过GPT定制的降重大模型“中文论文降重”&#xff0c;2小时即可完成一篇优质的、查重率较低的万字论文。 在ChatGPT4o对话框中…

GPT-5的到来:智能飞跃与未来畅想

IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂确认了GPT-5的发布计划&#xff0c;预计将在一年半后推出。穆拉蒂形象地将GPT-4到GPT-5的飞跃比作高中生到博士生的成长。这一飞跃将给我们带来哪些变化&#xff1f;GPT-5的…

计算机公共课面试常见问题:线性代数篇

目录 1. 特征向量和特征值代表什么含义&#xff1f; 2. 矩阵的秩是什么&#xff1f;满秩代表什么&#xff1f;不满秩呢&#xff1f; 3. 奇异值分解是什么&#xff1f; …

昇思25天学习打卡营第五天|网络构建

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第五天了。 今天是第五天&#xff0c;前四天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…

借助 Aspose.Words,在 C# 中将 Word 转换为 Excel

有时我们会遇到需要将 Word 文档&#xff08;DOC 或 DOCX&#xff09;转换为 Excel 文档的任务。例如&#xff0c;这对于数据分析和报告很有用&#xff0c;或者如果您收到了任何文本数据并想将其转换为表格格式&#xff08;XLS 或 XLSX&#xff09;以便进一步工作。在本文中&am…

sudo: /etc/init.d/ssh: command not found

在 WSL 中尝试启动 SSH 服务时遇到 sudo: /etc/init.d/ssh: command not found 错误 安装 OpenSSH 服务器 更新软件包列表 sudo apt update安装 OpenSSH 服务器 sudo apt install openssh-server启动 SSH 服务 在 WSL 2 上,服务管理与传统 Linux 系统有所不同。你可以手动启动…

开发RAG应用,你必须知道的7个Embedding模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Embedding模型是将文本数据转化为数值向量的核心技术&#xff0c;从而让计算机能够便捷地衡量文本间的语义关联&#xff0c;这种表示法已成为多种基础NLP任务的核心&#xff0c;如文本相似度判定、语义搜索、信息检索…

分享HTML显示2D/3D粒子时钟

效果截图 实现代码 线上体验&#xff1a;three.jscannon.js Web 3D <!DOCTYPE html> <head> <title>three.jscannon.js Web 3D</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-width,ini…

计算机专业课面试常见问题-编程语言篇

目录 1. 程序的编译执行流程&#xff1f; 2. C浅拷贝和深拷贝的区别&#xff1f; 3. C虚函数&#xff1f; …

Redis 内存碎片是什么?如何清理?

Redis 内存碎片相关的问题在得物、美团、阿里、字节、携程等公司的后端面试中都曾出现过&#xff0c;还是建议认真准备一下。即使不是准备面试&#xff0c;日常开发也是能够用到的&#xff01; 什么是内存碎片? 你可以将内存碎片简单地理解为那些不可用的空闲内存。 举个例子&…

openGauss开发者大会、华为云HDC大会举行; PostgreSQL中国技术大会7月杭州开启

重要更新 1. openGauss Developer Day本周五于北京举行&#xff0c;大会聚集了相关行业专家、用户、伙伴和开发者&#xff0c;分享给予openGauss的联合创新成果和实践案例。([2] ) &#xff1b;华为云 HDC 2024本周五于东莞松山湖举行&#xff0c;主题演讲主要覆盖鸿蒙、AI ([3…

超高速PCIe EtherCAT运动控制卡在高速异形插件机上的应用

市场应用背景 异形插件机主要应用于电子制造业中&#xff0c;专门用于自动化电子装配过程。它能够按照预设程序将编带或者供料器的电子元件通过多工位多头夹取&#xff0c;将电阻、电容、晶体管、连接器和按键等异形元件自动插装到PCB板的指定通孔上&#xff0c;极大地提高生产…

金仓25周年 | 风华茂,勇向前,精彩未完待续~

风华茂&#xff0c;勇向前 在这个充满着活力的夏季 人大金仓25岁生日如约而至 自6月起 司庆系列活动 如火如荼地开展&#x1f973; 目前司庆第一、二、三弹已经圆满结束 让我们一起回顾一下精彩瞬间吧~ 司庆系列活动第一弹&#xff1a;25挑战赛 金仓小伙伴们自由组队 向25个挑战…

Matlab/simulink三段式电流保护

电流1段仿真波形如下所示 电流2段仿真波形如下所示 电流3段仿真波形如下所示

1961 Springboot自习室预约系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 自习室预约管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库…

潮玩手办盲盒前端项目模版的技术探索与应用案例

一、引言 在数字化时代&#xff0c;随着消费者对个性化和艺术化产品的需求日益增长&#xff0c;潮玩手办和盲盒市场逐渐崭露头角。为了满足这一市场需求&#xff0c;前端技术团队需要构建一个功能丰富、用户友好的在线平台。本文旨在探讨潮玩手办盲盒前端项目模版的技术实现&a…

光学相机市场格局:中国光学相机市场评估及未来发展趋势研究报告

欢迎关注GZH《光场视觉》 光学相机行业定义 光学相机是一种利用光学镜头和感光材料&#xff08;如胶片&#xff09;或数字传感器来捕捉图像的装置。光学相机&#xff0c;也常被称作传统相机或胶片相机&#xff0c;其工作原理基于光的折射和聚焦。当光线通过相机的镜头进入时&…

企业如何顺利申请防水防腐保温二级资质

为确保企业能够顺利申请防水防腐保温二级资质&#xff0c;以下是详细的申请步骤和要点&#xff0c;参考了相关文件中的数字和信息&#xff1a; 一、了解申请条件 企业资产&#xff1a;企业净资产需达到400万元以上。企业主要人员&#xff1a; 二级注册建造师&#xff1a;不少于…