Contact me:

算法38 5. 最长回文子串

leetcode的提交不知道是不是有问题,我写的在本地跑起来比官方答案快,但是提交失败。

我的思路

正推,字符串首尾各放一指针,向中间查找相同项,找到后开始判断是否回文串,当两指针相遇判断结果,记录长度。并且第一个找到的回文串肯定是最大,所以前面的指针向前继续查找

string longestPalindrome(string s) {
        int p,max;
        p=0;//标记最长子串的指针
        max=1;//记录最大值
        for(int i=0;i<s.size()-1;i++){
            for(int j=s.size()-1;j>i;j--){
                bool q=0;//当找到回文串结束j循环

                if(s[i]==s[j]){//找到回文串边界,开始判断
                    for(int y=i,z=j;z>=y;y++,z--){
                        if(s[y]!=s[z]) break;
                        if(y==z||y==z-1)//结束判断,记录大小
                            if(j-i+1>max){ 
                                p=i;
                                max=j-i+1;
                                q=1;
                            }   
                    }

                }
                if(q) j=i;//找到回文串
            }
        }
        return s.substr(p,max);
    }

中心扩展法

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1)
            return s;
        int start=0;//记录回文子串起始位置
        int end=0;//记录回文子串终止位置
        int mlen=0;//记录最大回文子串的长度
        for(int i=0;i<len;i++)
        {
            int len1=expendaroundcenter(s,i,i);//一个元素为中心
            int len2=expendaroundcenter(s,i,i+1);//两个元素为中心
            mlen=max(max(len1,len2),mlen);
            if(mlen>end-start+1)
            {
                start=i-(mlen-1)/2;
                end=i+mlen/2;
            }
        }
        return s.substr(start,mlen);
        //该函数的意思是获取从start开始长度为mlen长度的字符串
    }
private:
    int expendaroundcenter(string s,int left,int right)
    //计算以left和right为中心的回文串长度
    {
        int L=left;
        int R=right;
        while(L>=0 && R<s.length() && s[R]==s[L])
        {
            L--;
            R++;
        }
        return R-L-1;
    }
};
posted @ 2021-12-24 19:21  impwa  阅读(32)  评论(0编辑  收藏  举报