欢迎来到军工软件开发人才培养基地——学到牛牛

力扣题库5. 最长回文子串

时间:2024-05-06 07:01:10 来源:学到牛牛

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

 

 

示例 1:

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

示例 2:

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

 

题解:

什么叫回文串?

如果一个字符串正着读和反着读是一样的,那它就是回文串。

这应该算是暴力法吧。

遍历数组,固定住左端,然后从最右端往前找与固定住的字符相同的,再判断是否是回文串,不是的话继续往前找,一直找到固定住的那个字符,如果是回文子串,记录下长度以及固定住的那个字符的下标,然后跳出循环,进行下一个字符的循环。

 

完整代码:

#include <stdio.h>

char * longestPalindrome(char * s)

{

int left = 0;

int right = strlen(s);

    int maxSize = 1;

    int t = 0;

    int start = 0;

    if(right <= 1 )

    return s;

    for(left = 0;s[left]!='\0';left++)//从最左边开始遍历

    {

        t = 0;//判断是否有最大值替换;

        if(right - left + 1 <= maxSize)

        {

            break;//如果数组剩余字符数量少于maxSize,直接跳出循环;

        }

        for(right = right-1;right>left;right--)//右边往前遍历数组;

        {

            if(s[left]==s[right])

            {

                for(int i = left,j = right;i <= j;i++,j--)

                {

                    if(i == j||(i==j-1&&s[i]==s[j]))

                    {

                        if(maxSize<(right-left+1))

                        {

                            maxSize = right - left + 1;

                            start = left;

                            t = 1;//maxSize修改值之后退出此外层循环;

                        }

                    }

                    if(s[i]!=s[j])//判断是否是回文串

                    {

                       break;

                    }

                }    

            }

            if(t==1)

            {

                break;

            }

        }

        right = strlen(s);

    }

    s[start + maxSize] = '\0';

    return s+start;

}