leetcode5

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

暴力枚举法超时,采用中心扩展法

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;

    }

};

 

 

class Solution {
public:
    string longestPalindrome(string s) {
        int len = s.length();
        if(len==1) return s;
        else if(len == 2)
        {
            if(s[0]==s[1]) return s;
            else 
            {
                string s1 = {s[0]};
                return s1;
            }
        }
        else
        {
            int maxlen = 0;
            int start = 0;
            int end = 0;
            for(int i = 1; i < len; i++)
            {
                int len1 = onecore(s,len,i-1,i+1);
                int len2 = onecore(s,len,i-1,i);
                //计算出了最长的长度
                maxlen=(max(len1,len2)>maxlen)? max(len1,len2):maxlen;
                //计算起始位置  每次更新起始和结束位置
                if(maxlen>(end-start+1))
                {
                    start = i - (maxlen)/2;
                    end = i + (maxlen-1)/2;
                }
            }

            return s.substr(start,maxlen);
        }
    }
    private:
    int onecore (string s, int slen ,int left, int right)
    {
        int len = 1;
        while(left>=0 && right<=slen-1)
        {
            if((s[left]==s[right])&&(right-left==1))//用来判断是否是采用两个字符做中心
            {
                left--;
                right++;
                len+=1;
            }
            else if(s[left]==s[right])//找到中心后往两边扩展
            {
                left--;
                right++;
                len+=2;
            }
            else
            {
                break;
            }
        }
        return len;
    }

};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值