力扣每日一题五:最长回文子串

原题描述:

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

题目分析:

本题的思路很简单,就是一个循环for(int i=0;i<strlen(s)-1;i++),然后循环内部再套一层循环for(int j=i+1;j<len;j++),再第二层循环内部判断从s[i]到s[j]是不是回文串,是的话该回文串的长度(即j-i+1)与前一个最长回文子串的长度max作比较,max取较大值,如果发现新的最长回文子串的末尾已经到了s[len-1]的位置,说明后面已经没有更长的子串了,就退出双层循环,返回这个子串即可。

代码展示:

bool ispali(char *s,int begin,int end)
{
    int i=begin,j=end;
    while(i<j)
    {
        if(s[i]!=s[j]) return false;
        i++,j--;
    }
    return true;
}
char * longestPalindrome(char * s){
    if(strlen(s)<2) return s;//max的最小值是1
    int begin=0,end=0;
    int max=1;
    int len=strlen(s);
    for(int i=0;i<len-1;i++)
    {
        for(int j=i+1;j<len;j++)
        {
            if(ispali(s,i,j)&&max<j-i+1)
            {
                max=j-i+1;
                begin=i,end=j;
                if(j==len-1) goto loop;
            }
        }
    }
    loop:;
    s[end+1]='\0';
    return s+begin;
}

注意:

1、函数要求返回最长子串,而不是它的长度,所以要有两个变量begin和end时刻记录最长字串的起点和终点,最后将s[end+1]赋值成'\0',返回s+begin即可

2、在找到j==len-1的最长回文子串后,这个子串的长度一定是整个字符串的回文子串的最大长度,此时需要退出两层循环,break只能退出所在那一层的循环,这里就可以用到goto语句。goto语句是个无条件转向语句,再程序中要慎用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值