LeetCode2108 找出数组中的第一个回文字符串

寻找字符串数组中的第一个回文字符串

在编程的世界里,字符串处理是一个非常常见且重要的任务。今天我们就来探讨一个有趣的字符串处理问题:如何在一个给定的字符串数组中找出第一个回文字符串。

一、回文字符串的概念

回文字符串是一种特殊的字符串,它正着读和反着读的结果是一样的。例如 “racecar”、“level”、“ada” 等都是回文字符串。

二、解决思路

我们的目标是在一个字符串数组中找到第一个回文字符串。最直接的方法就是遍历这个数组中的每一个字符串,然后检查每个字符串是否为回文字符串。一旦找到第一个回文字符串,就可以停止遍历并返回该字符串。如果遍历完整个数组都没有找到回文字符串,那么就返回一个空字符串。

方法一:

三、代码实现

char* firstPalindrome(char** words, int wordsSize) {for (int i = 0; i < wordsSize; i++) {int len = strlen(words[i]);int j;for (j = 0; j < len / 2; j++) {if (words[i][j]!= words[i][len - j - 1]) {break;}}if (j == len / 2) {char* result = (char*)malloc((len + 1) * sizeof(char));strcpy(result, words[i]);return result;}}return "";
}

首先,我们定义了一个函数 firstPalindrome,它接收两个参数,一个是二维字符指针 words,这其实就相当于指向字符串数组的指针,另一个参数 wordsSize 则代表了这个字符串数组里字符串的个数。

在函数内部呢,外层通过一个 for 循环(for (int i = 0; i < wordsSize; i++))来依次遍历字符串数组中的每一个字符串。针对每一个当前正在处理的字符串 words[i],先是使用 strlen 函数获取它的长度 len,接着开启内层的 for 循环(for (j = 0; j < len / 2; j++)),这个内层循环就是用来判断当前字符串是否为回文字符串的。在这个内层循环里,比较当前字符串对称位置上的字符(也就是第 j 个字符和倒数第 j 个字符),要是发现它们不相等了,那就通过 break 语句跳出内层循环。

当内层循环结束后,我们会进行一个判断(if (j == len / 2)),要是 j 的值刚好等于 len / 2,这就意味着从字符串开头到中间位置的字符与对应的对称位置字符都相等呀,也就表明这个字符串是回文字符串了。此时呢,我们要返回这个字符串,不过需要注意的是,为了避免返回局部变量地址导致的问题(因为函数结束后局部变量所在内存会被释放),我们使用 malloc 函数动态分配了一块足够存储这个字符串(要包含字符串结束符 '\0' 哦,所以长度是 len + 1)的内存空间,再通过 strcpy 函数把当前的回文字符串复制到新分配的这块内存里,最后返回指向这个新内存空间的指针,也就是返回了找到的第一个回文字符串啦。

要是整个外层循环结束了,都没有找到符合回文条件的字符串,那函数最后就直接返回一个空字符串,表示没找到相应的回文字符串哦。

四、测试示例

以下是一个简单的 main 函数来进行测试的示例代码:

#include <stdio.h>int main() {char* words[] = {"abc", "car", "ada"};int wordsSize = sizeof(words) / sizeof(words[0]);char* palindrome = firstPalindrome(words, wordsSize);if (palindrome[0]!= '\0') {printf("第一个回文字符串为:%s\n", palindrome);free(palindrome);} else {printf("未找到回文字符串\n");}return 0;
}

在这个 main 函数里,我们先是定义了一个字符串数组 words,并且初始化了一些字符串在里面,然后计算出这个数组的大小 wordsSize。接着调用 firstPalindrome 函数,将得到的返回结果存放在 palindrome 指针变量里。之后进行一个判断,如果 palindrome 指向的字符串第一个字符不是字符串结束符 '\0',那就说明找到了回文字符串呀,我们就把它打印输出出来,同时可别忘了使用 free 函数释放之前通过 malloc 分配的内存空间,避免出现内存泄漏问题哦。要是 palindrome 指向的是一个空字符串,那就输出提示信息,表示没有找到回文字符串啦。  

方法二:

代码改进:

bool find (char b[], int len) {int l = 0, r = len - 1;while (l < r) {if (b[l] != b[r]) return false;l++, r--;}return true;
}
char* firstPalindrome(char** words, int wordsSize) {char *a = (char *)calloc(105, sizeof(char));for (int i = 0; i <wordsSize; i++) {if (find(words[i], strlen(words[i]))) {strcpy (a, words[i]);break;}}return a;
}
(一)判断回文字符串的函数 find

先来看这个用于判断一个字符串是否为回文字符串的函数 find

bool find (char b[], int len) {int l = 0, r = len - 1;while (l < r) {if (b[l]!= b[r]) return false;l++, r--;}return true;
}

这个函数接受两个参数,一个是字符数组 b,它代表了我们要去判断是否为回文字符串的那个字符串;另一个参数 len 则是该字符串的长度。

在函数内部,定义了两个指针变量(或者说索引变量更便于理解)l 和 r,分别初始化为字符串的开头(索引为 0)和结尾(索引为 len - 1)。接着通过一个 while 循环来进行判断,只要 l 小于 r,就说明还没有比较完字符串中间位置之前的所有对称字符对。在循环体中,比较当前对称位置的字符(也就是 b[l] 和 b[r]),如果发现这两个字符不相等,那就直接返回 false,表示这个字符串不是回文字符串。要是一直比较到 l 不再小于 r 了,意味着从开头到中间位置的字符与对应的对称位置字符都相等呀,此时就返回 true,说明该字符串是回文字符串呢。

(二)查找第一个回文字符串的主函数 firstPalindrome

再看看负责在字符串数组中查找第一个回文字符串的函数 firstPalindrome

char* firstPalindrome(char** words, int wordsSize) {char *a = (char *)calloc(105, sizeof(char));for (int i = 0; i < wordsSize; i++) {if (find(words[i], strlen(words[i]))) {strcpy (a, words[i]);break;}}return a;
}

这个函数接收两个参数,char** words 是指向字符串数组的指针,也就是用来传入我们要查找回文字符串的那个字符串数组;int wordsSize 表示这个字符串数组里字符串的个数

函数一开始,使用 calloc 函数动态分配了一块大小为 105 个 char 类型字节的内存空间,并将返回的指针赋值给 a。这里分配 105 字节的空间假设了字符串的长度不会超过一定限制(实际应用中可根据具体需求合理调整这个大小哦),并且使用 calloc 函数会将分配的内存空间初始化为全 0,方便后续操作。

然后通过一个 for 循环(for (int i = 0; i < wordsSize; i++))来遍历整个字符串数组。在每次循环中,调用之前定义的 find 函数,传入当前字符串 words[i] 以及它的长度(通过 strlen(words[i]) 获取),去判断这个字符串是否是回文字符串。要是 find 函数返回 true,说明找到了回文字符串了呀,那就使用 strcpy 函数把这个回文字符串复制到之前分配好的内存空间 a 中,然后通过 break 跳出循环,因为我们只需要找到第一个回文字符串就可以了。

最后,函数返回指针 a,这个指针要么指向找到的第一个回文字符串所在的内存空间(如果找到了的话),要么指向一块初始化为全 0 的内存空间(如果没找到回文字符串,就返回这个空的初始化空间表示没找到)。

注意事项及优化思考
  • 内存管理方面:这里使用 calloc 分配了固定大小的内存空间,在实际应用中,如果字符串长度可能会超过这个预设值,就可能导致缓冲区溢出等问题哦。更好的做法可以是根据实际找到的回文字符串长度来动态分配准确的内存大小,或者设置一个更合理的较大值并进行长度检查等操作来确保安全。
  • 代码复用与通用性:当前代码实现了基本的功能,但如果后续要在不同的场景下查找回文字符串,比如处理不同编码的字符串或者对查找规则有细微变化等情况,可能需要进一步封装和抽象代码,让函数的通用性更强,例如可以把判断回文字符串的逻辑提取成更独立、可配置的模块等。

总结

这种对数组进行遍历,然后针对每个元素进行特定条件判断的思路,在很多字符串处理以及其他数据处理相关的编程场景里都是很常用的哦。当然啦,实际编程中可能还会碰到比如字符串编码、字符串里包含特殊字符之类的复杂情况,但只要掌握了基础的思路和方法,再去应对那些复杂问题就会更得心应手啦。希望这篇博客能助力大家更好地理解和运用 C 语言中字符串处理这方面的知识,要是大家有什么疑问或者更好的想法,欢迎在评论区留言分享哦。

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

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

相关文章

为什么要在PHY芯片和RJ45网口中间加网络变压器

在PHY芯片和RJ45网口之间加入网络变压器是出于以下几个重要的考虑&#xff1a; 1. 电气隔离&#xff1a;网络变压器提供了电气隔离功能&#xff0c;有效阻断了PHY芯片与RJ45之间直流分量的直接连接。这样可以防止可能的电源冲突&#xff0c;降低系统故障的风险&#xff0c;并保…

深度学习助力股市预测:LSTM、RNN和CNN模型实战解析

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;众所周知&#xff0c;传统的股票预测模型有着各种各样的局限性。但在我的最新研究中&#xff0c;探索了一些方法来高效预测股市走势&#xff0c;即CNN、RNN和LSTM这些深度学习…

sql字段值转字段

表alertlabel中记录变字段 如何用alertlabel表得到下面数据 实现的sql语句 select a.AlertID, (select Value from alertlabel where AlertIDa.AlertID and Labelhost) as host, (select Value from alertlabel where AlertIDa.AlertID and Labeljob) as job from (select …

【Flutter_Web】Flutter编译Web第三篇(网络请求篇):dio如何改造方法,变成web之后数据如何处理

前言 Flutter端在处理网络请求的时候&#xff0c;最常用的库当然是Dio了&#xff0c;那么在改造成web端的时候&#xff0c;最先处理的必然是网络请求&#xff0c;否则没有数据去处理驱动实图渲染。 官方链接 pub https://pub.dev/packages/diogithub https://github.com/c…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

OpenCV-Python实战(6)——图相运算

一、加法运算 1.1 cv2.add() res cv2.add(img1,img2,dstNone,maskNone,dtypeNone) img1、img2&#xff1a;要 add 的图像对象。&#xff08;shape必须相同&#xff09; mask&#xff1a;图像掩膜。灰度图&#xff08;维度为2&#xff09;。 dtype&#xff1a;图像数据类型…

41 stack类与queue类

目录 一、简介 &#xff08;一&#xff09;stack类 &#xff08;二&#xff09;queue类 二、使用与模拟实现 &#xff08;一&#xff09;stack类 1、使用 2、OJ题 &#xff08;1&#xff09;最小栈 &#xff08;2&#xff09;栈的弹出压入序列 &#xff08;3&#xf…

运行StableDiffusionInpaintPipeline的Example时报错:OSError: Cannot load model runwayml/stable-diffusion-...

项目地址&#xff1a; https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/inpainthttps://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/inpaint在云服务器端运行下面给出的Example的时候出现报错&#xff1a; (myconda) rootwnyrpE:…

JDK高频面试题(包重点)

一、什么是JDK JDK&#xff08;Java Development Kit&#xff09;即 Java 开发工具包&#xff0c;是 Java 编程的基础与核心&#xff0c;由 Sun Microsystems&#xff08;现归属于 Oracle 公司 &#xff09;开发&#xff0c;主要作用如下&#xff1a; 1、提供编译环境 它包含了…

pikachu靶场搭建详细步骤

一、靶场下载 点我去下载 二、靶场安装 需要的环境&#xff1a; mysqlApaches&#xff08;直接使用小皮面板Phpstudy&#xff1a;https://www.xp.cn/&#xff09;&#xff0c;启动他们 设置网站&#xff0c;把靶场的路径对应过来 对应数据库的信息 由于没有核对数据库的信…

第P4周:猴痘病识别

目录 前言一、我的环境二、代码实现1. 前期准备1.1 设置GPU1.2 导入数据1.3 划分数据集 2. 构建简单的CNN网络3. 训练模型3.1 设置超参数3.2 编写训练函数3.3 编写测试函数3.4 正式训练 4. 结果可视化4.1 Loss与Accuracy图4.2 指定图片进行预测 5. 保存并加载模型 三、学习体会…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation&#xff1f;基本结构after 参数的作用问题背景&#xff1a;传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

如何用WPS AI提高工作效率

对于每位职场人而言&#xff0c;与Word、Excel和PPT打交道几乎成为日常工作中不可或缺的一部分。在办公软件的选择上&#xff0c;国外以Office为代表&#xff0c;而在国内&#xff0c;WPS则是不可忽视的一大选择。当年一代天才程序员求伯君创造了WPS&#xff0c;后面雷军把它装…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述&#xff1a;1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时&#xff0c;往往会想到在多个GPU或多台机器上进行模型训练。不过&#xff0c;即便是在单个GPU上&#xff0c;也存在多种方法来训练更大规模的模型并提升…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试&#xff1f; 速度&#xff1a;Go速度很快&#xff0c;这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性&#xff1a;可以利用Go的内置并发性(goroutines)来并行化测试执行 简单&#xff1a;Go的简约语法允许您编写可读且可维护…

2、C#基于.net framework的应用开发实战编程 - 设计(二、三) - 编程手把手系列文章...

二、设计&#xff1b; 二&#xff0e;三、构建数据库&#xff1b; 此例子使用的是SQLite数据库&#xff0c;所以数据库工具用的SQLiteStudio x64&#xff0c;这个是SQLite专用的数据库设计管理工具&#xff0c;其它的数据库管理工具比如DBeaver的使用请见实战工具系列文章。 1、…

2011-2020年各省城镇职工基本医疗保险年末参保人数数据

2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间&#xff1a;2011-2020年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;省份、时间、城镇职工基本医疗保险年末参保人数 4、范围&#xff1a;31省 5、指标解释&#xff1a;参保人数指报告期末按国家有关…

Github优质项目推荐(第九期)

文章目录 Github优质项目推荐&#xff08;第九期&#xff09;一、【tldraw】&#xff0c;37.1k stars - 在 React 中创建无限画布体验的库二、【zapret】&#xff0c;9.1k stars - 独立&#xff08;无需第三方服务器&#xff09;DPI 规避工具三、【uBlock】&#xff0c;48.3k s…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中&#xff0c;保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现&#xff0c;还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

KOI技术-事件驱动编程(前端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…