最长回文字串-C语言

本文介绍了如何使用C语言解决寻找字符串中最长回文子串的问题。文章探讨了暴力解法和中心扩散法两种策略,并对中心扩散法进行了详细解释,包括从单个字符出发向两边扩散的思路,以及处理奇偶长度回文子串的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

自己之所以想把这道题给记录下来是因为写这道题的时候,自己卡了很久。

解法一:暴力解法

取出每一个字串,然后判断子串是否是回文数。

int IsPalidrome(char *s, int num)//判断传进来得字符串是不是回文数
{
	int left &
### C语言实现查找最长文字符串 为了实现在给定字符串中找到最长文子串,可以采用中心扩展法。这种方法基于观察到的一个事实:一个文串是从它的中心向两边展开的,并且可以根据长度分为奇数和偶数两种情况。 #### 中心扩展算法描述 对于每一个可能的中心位置,尝试向外扩展直到无法形成新的有效文字串为止。具体来说: - 对于每个字符作为单个中心点(即长度为奇数的情况) - 或者每一对相邻字符之间的间隙作为中心点(即长度为偶数的情况) 每次更新最大长度以及对应的起始索引,最终得到整个字符串中最长的那个文子串[^4]。 下面是具体的C语言代码实现: ```c #include <stdio.h> #include <string.h> // 函数用于计算以left和right为中心的最大文半径 void expandAroundCenter(const char* s, int length, int left, int right, int* start, int* maxLength) { while (left >= 0 && right < length && s[left] == s[right]) { --left; ++right; } if (*maxLength < right - left - 1) { *start = left + 1; *maxLength = right - left - 1; } } char* longestPalindrome(char* s) { int n = strlen(s); if (!n || !s) return ""; int start = 0, maxLength = 0; for (int i = 0; i < n;) { // 尝试把当前字符当作中心来扩展 expandAroundCenter(s, n, i, i, &start, &maxLength); // 如果下一个字符相同,则继续扩大范围再做一次尝试 if ((i + 1 < n) && (s[i] == s[i + 1])) { expandAroundCenter(s, n, i, i + 1, &start, &maxLength); ++i; // 跳过重复项 } ++i; } // 动态分配内存保存结果并复制相应部分进去 char* result = malloc((maxLength + 1) * sizeof(char)); strncpy(result, s + start, maxLength); result[maxLength] = '\0'; return result; } ``` 这段代码实现了上述提到的方法,并能够有效地找出任意输入字符串内的最长连续文序列[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值