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多加了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;
}

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

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

相关文章

Swagger与RESTful API

1. Swagger简介 在现代软件开发中&#xff0c;RESTful API已成为应用程序间通信的一个标准。这种架构风格通过使用标准的HTTP方法来执行网络上的操作&#xff0c;简化了不同系统之间的交互。API&#xff08;应用程序编程接口&#xff09;允许不同的软件系统以一种预定义的方式…

一键进阶ComfyUI!懂AI的设计师现在都在用的节点式Stable Diffusion

前言 _ 万字教程&#xff01;奶奶看了都会的 ComfyUI 入门教程 推荐阅读 一、川言川语 大家好&#xff0c;我是言川。 阅读文章 > ](https://www.uisdc.com/comfyui-3) 目前使用 Stable Diffusion 进行创作的工具主要有两个&#xff1a;WebUI 和 ComfyUI。而更晚出现的…

2000—2022年青藏高原遥感生态指数数据集

该数据集是基于多套MODIS数据集&#xff0c;选取NDVI、LST、WET、NDBSI四项指标&#xff0c;采用主成分分析法&#xff0c;生成2000-2022年500米空间分辨率的遥感生态指数&#xff08;RSEI&#xff09;数据集。 遥感生态指数&#xff1a;是一种基于遥感技术的生态环境质量综合评…

容联云容犀Desk在线客服:全渠道+全场景+全智能辅助,提升客户体验

如今&#xff0c;客户体验已经从基础的对话、交易、业务办理&#xff0c;转变为深度的生活联结、情感共鸣、价值认可。客户期待的转变&#xff0c;也让更多企业越发重视“以客户为中心”的业务增长战略。 容犀Desk营销服统一体验工作空间应运而生&#xff0c;其核心能力在线客…

wsl ubuntu 安装Anaconda3步骤

如何在Ubuntu上安装Anaconda3呢?本章记录整个安装过程。 1、下载脚本 https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 下载之后,将脚本上传到Ubuntu里。 2、安装脚本 bash Anaconda3-2021.11-Linux-x86_64.sh根据提示进行安装,提示输…

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案

React&#xff1a;tabs或标签页自定义右击菜单内容&#xff0c;支持内嵌iframe关闭菜单方案 不管是react、vue还是原生js&#xff0c;原理是一样的。 注意如果内嵌iframe情况下&#xff0c;iframe无法使用事件监听&#xff0c;但是可以使用iframe的任何点击行为都会往父级wind…

【等保】网络安全等级保护(等保2.0PPT)

等保2.0&#xff08;网络安全等级保护基本要求的第二代标准&#xff09;的推出和实施&#xff0c;是基于多方面的考虑和需求。以下是实施等保2.0的主要原因&#xff1a; 加强网络安全保护&#xff1a; 随着网络技术的不断发展和网络威胁的不断增加&#xff0c;传统的网络安全保…

BGP中的TCP连接源地址问题

3.TCP连接源地址&#xff08;用loop back地址是最优选择&#xff09; 应用场景与理论&#xff1a; 由于BGP应用于大型网络中&#xff0c;为了避免单点失败&#xff0c;往往需要通过多条链路连接&#xff0c;当一条链路故障时候就用另一条链路继续工作&#xff0c;但是BGP又无法…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

IO-Link软件开发流程

目录 了解IO-Link协议&#xff1a; 确定物理连接方式&#xff1a; 编写驱动程序&#xff1a; 测试通信&#xff1a; 集成与应用&#xff1a; 优化与迭代&#xff1a; 文档编写与用户支持&#xff1a; IO-Link产品的开发流程主要包括以下几个步骤 了解IO-Link协议&#x…

【java实习评审】 项目详情模块,如何设计关联表,提高查询性能

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推评分16”第一期电影详情模块 java同学的文档周最佳作品。 1、本项目是基于年轻人的喜好&#xff0c;更个性的电影推荐网站。筛选各分类的知名电影&#xff0c;并给出推荐理由和下载链接。另外&#xff0c;通过…

泰迪智能科技实验室产品-云计算资源管理平台介绍

云计算资源管理平台是一款集群应用程序管理平台&#xff0c;以Docker、Kubernetes为核心引擎的容器化应用部署、运行环境&#xff0c;对数据中心的物理服务器、网络、存储、虚拟服务器等基础架构资源进行集中统一的管理、分配、监控等。平台旨在围绕行业应用逐步由“虚拟化”向…

Docker部署前端,动态配置后端地址

本文介绍了使用Docker环境变量动态配置nginx。采用的是通过docker run -e xxxxxxx先往容器注入环境变量&#xff0c;然后进一步通过envsubst指令将环境变量写入到conf文件中&#xff0c;实现动态配置文件内容。 背景 前后端分离的架构下&#xff0c;经常会用到nginx反向代理来…

深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)

5&#xff0c;梯度下降优化器 5&#xff0c;1 梯度下降在深度学习中的作用 在深度学习中&#xff0c;权重W的值是否合理是由损失函数L来判断的。L越小&#xff0c;表示W的设置越happy。L越大&#xff0c;表示W的值越unhappy。 为了让L越来越小&#xff0c;常用的方法是梯度下降…

自主可控的芯片设计供应链软件:保障芯片产业安全的关键

在当前的科技浪潮中&#xff0c;芯片作为信息技术的核心&#xff0c;其设计、制造和供应链的安全性和自主可控性显得尤为重要。而自主可控的芯片设计供应链软件&#xff0c;正是保障这一产业链安全的关键环节。 首先&#xff0c;我们要明确自主可控芯片设计供应链软件的核心价值…

【强化学习】第02期:动态规划方法

笔者近期上了国科大周晓飞老师《强化学习及其应用》课程&#xff0c;计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处&#xff0c;敬请批评指正。 文章目录 2.1 动态规划&#xff1a;策略收敛法/策略迭代法2.2 动态规划&#xf…

聚星文社AI工具

聚星文社AI工具是一种基于人工智能技术开发的工具&#xff0c;旨在辅助作者和写作人员提升创作效率和质量。 点击下载 该工具可以提供多项功能&#xff0c;包括语法纠错、智能推荐、文章自动摘要等。 通过使用聚星文社AI工具&#xff0c;用户可以在写作过程中得到即时的纠错建…

数据库使用笔记

1.mysql数据库频繁访问导致连接超时 解决办法一&#xff1a; 优化查询&#xff1a;检查并优化SQL查询语句&#xff0c;减少不必要的数据库调用。增加连接池大小&#xff1a;如果应用程序使用连接池&#xff0c;可以考虑增加连接池的最大连接数。&#xff08;注&#xff1a;不能…

权限维持-域环境单机版---自启动

免责声明:本文仅做技术交流与学习... 目录 1.windows自启动路径加载 2.自启动服务加载 3.自启动注册表加载 所在regedit目录: -添加启动项 --重启生效 4.计划计时任务 windows软件或程序服务开机自启动的四种方式-CSDN博客 1.windows自启动路径加载 --当windows注销…

LabVIEW在机器人研究所中的应用

机器人研究所致力于机器人技术的研究与开发&#xff0c;涵盖工业机器人、服务机器人、医疗机器人等多个领域。研究所需要一个高效、灵活的实验控制和数据采集系统&#xff0c;以进行复杂的机器人实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监控&am…