leetcode-简单-c语言-最长回文子串-20210802

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

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

示例 2:
输入:s = "cbbd"
输出:"bb"

示例 3:
输入:s = "a"
输出:"a"

示例 4:
输入:s = "ac"
输出:"a"

代码:
//思路:
//字符串为1时,返回字符串唯一的字符
//字符串大于1时,没有相同字符时,返回第一个字符
//字符串大于1时,有对称的时,返回最长回文子串
#define max(a,b) ((a>b)?(a):(b))
int function(char *s, int l, int r, int len)
{
    while(l>=0&&r<len&&s[l]==s[r])
    {
        l--;
        r++;
    }
    return r-(l+1);//逻辑可以参照一个样例计算,例如cbbd,当i=1时,跳出循环时,l=0,r=3
}
char * longestPalindrome(char * s){
    int len = strlen(s);
    if(len == 1 || len == 0)
    {
        return s;
    }
    int i = 0, k = 0, num = 0, tl = 0, tr = 0;
    int oneNum = 0, twoNum = 0;
    for(i=0;i<len;i++)
    {
        oneNum = function(s, i, i, len);    //情况1:i为中心i的两边对称,例如aba
        twoNum = function(s, i, i+1, len);  //情况2:i和i+1对称,例如bb
        num = max(max(oneNum, twoNum), num);//情况1和情况2返回的长度找最大值,与原来的最大值对比,找出最大值
        //重新赋值,回文字符串的始末下标
        if(num > tr-tl+1)
        {
            tl = i-(num-1)/2; //注意这里的numnum-1,为什么?只知道bb情况会影响tl值
            tr = i+num/2; 
        }
    }
    printf("%d %d %d %c %c",num, tl, tr, s[tl], s[tr]);
    char *temp = (char *)malloc(sizeof(char)*(num+1));
    memcpy(temp, s+tl, sizeof(char)*num);
    temp[num] = '\0';
    return temp;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏一点

您的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值