代码学习:最长回文子串

#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:复制字符的上限数目
  1. 如果源字符串长度小于n,自动填充‘\0’;
  2. 如果大于等于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;
}
  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值