最长回文字符串

对于这种问题可以采用中心遍历法,可以分为两种情况,一种是中心字符串长度为1,一种是中心字符串长度为2的时候。

1.1个的时候

这时候我们要遍历字符串,第一次循环的时候选择S[0]为中心字符串,然后比较S[0]左右有多少字符串是相等的(对称),显然S[0]左边没有字符,所以第一次遍历结束,然后进行第二次循环的时候选择S[1]为中心字符串,以此类推。

2.2个时候

需要选择两个字符作为中心字符,之后就和上面奇数时相似。

3.需要特别注意的时候是需要同时遍历当中心字符为1个或2个的时候

当字符串长度为奇数时有一种特殊情况,比如acbba,如果只考虑中心字符为1则输出是a,如果考虑中心字符串为2,则输出bb。

我自己的代码

char* longestPalindrome(char* s) {
    int len=strlen(s);
    int maxlength=1;
    int start=0;
    for(int i=0;i<len;i++)//中心字符为2个
    {
        int right=i;
        int left=i;
        while(left>=0&&right<len&&s[right]==s[left])
        {
            right++;
            left--;
        }
        if(right-left-1>maxlength)
        {
            start=left+1;
            maxlength=right-left-1;
        }
    }
    for(int i=0;i<len;i++)//中心字符为2个
    {
        int right=i+1;
        int left=i;

        while(left>=0&&right<len&&s[right]==s[left])
        {
            right++;
            left--;
        }
        if(right-left-1>maxlength)
        {
            start=left+1;
            maxlength=right-left-1;
        }
    }
    char* result=(char*)malloc(sizeof(char)*(maxlength+1));
    strncpy(result,s+start,maxlength);//以s[start]为起点,复制maxlength长度的字符串到result
    result[maxlength]='\0';
    return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值