#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数原型声明
int expandAroundCenter(const char *s, int left, int right);
char* longestPalindrome(const char *s);
(若后面函数想在前面函数中使用,可在前面声明)
// 以left和right为中心扩展,寻找最长回文
int expandAroundCenter(const char *s, int left, int right) {
int len = strlen(s);
while (left >= 0 && right < len && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1; // 返回回文的长度;由于最后 - - 、+ + 不符合,因此-1
}
从left向左遍历,right向右遍历;返回该次遍历回文长度
// 寻找最长回文子串
char* longestPalindrome(const char *s) {
int start = 0, end = 0;
for (int i = 0; i < strlen(s); i++) {
int len1 = expandAroundCenter(s, i, i); // 奇数长度的回文
int len2 = expandAroundCenter(s, i, i + 1); // 偶数长度的回文
int len = len1 > len2 ? len1 : len2;//取该次循环最长回文长度
下面是寻找该次循环的回文子串开始位置和字符内容结束位置
if (len > end - start) {//只有在回文长度大于等于上一次长度,才重新赋值开始、结束
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
其中,(len - 1) / 2为i与start之差,len / 2为i与end之差(由于是整形运算,只取整数位置)
循环结束,得到最长子串的开始位、内容结束位。通过strncpy函数将该子串复制到新的数组:
int resultLength = end - start + 1;
char* result = (char*)malloc(sizeof(char) * (resultLength + 1)); // 分配内存
if (result != NULL) {
strncpy(result, s + start, resultLength);
result[resultLength] = '\0'; // 确保字符串以空字符结尾
}
return result;
}
1. 重新根据start、end运算长度:
在大多数编程语言中,循环体内定义的变量的作用域仅限于该循环体内部。一旦循环结束,这些变量的作用域也就结束了,它们不再占用内存空间。
2. 分配内存:
char* result = (char*)malloc(sizeof(char) * (resultLength + 1));
函数定义:void* malloc(size_t size); ——在头文件 <stdlib.h>
通过malloc函数,可以在堆区分配一块指定大小(size,单位为字节)的内存以存放数据。该内存直到显性释放(free)前一直存在,而不会像栈区一样在函数结束后自动销毁;(使用malloc函数分配的内存一定要free,否则导致内存泄漏)
函数类型是void*(空指针类型),可以转换为其它类型的指针而不需要显性转换(但也可以写上类型转换语句);
如果分配成功,malloc函数会返回指向该分配内存的指针,否则返回NULL;(因此有必要判断返回值是否NULL);
分配的大小为resultLength+1(补上‘\0’位)个char类型空间,并将该空间类型转换为指针变量赋值给result;
3. 复制子串:
strncpy(result, s + start, resultLength);
函数定义:char *strncpy(char *dest, const char *src, size_t n); (在头文件<string.h>)
- dest:存储复制数据的数组;
- src:指向要复制的源字符串的指针;(即要复制的字符串的首位指针)
- n:复制字符的上限数目
- 如果源字符串长度小于n,自动填充‘\0’;
- 如果大于等于n,则复制n个字符后停止,不保证‘\0’结尾;
int main() {
char input[] = "babad";
char* result = longestPalindrome(input);
printf("The longest palindrome substring is: %s\n", result);
free(result); // 释放动态分配的内存
return 0;
}