leetcode 5. Longest Palindromic Substring

1.题目

Total Accepted: 98199  Total Submissions: 432790  Difficulty: Medium

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

求一个字符串的最长回文子串。

2.思路 


解法一:经典的manacher算法。。。详见:http://blog.csdn.net/yzl_rex/article/details/7908259

class Solution {
public:
    string changeStr(string s){
        string newStr;
        newStr += "@#";
        for(int i=0;i<s.size();i++){
            newStr.push_back(s[i]);
            newStr.push_back('#');
        }
        return newStr;
    }
    string longestPalindrome(string s) {
        int i,id=0,mx=0,maxpid=0,maxplen=1;
        string ans;
        string newStr = changeStr(s);
        vector<int> p(newStr.size());
        for(int i=0;i<newStr.size();i++){
            if(mx>i)
                p[i] = min(p[2*id-1],mx-i); //核心
            else
                p[i]=1;
            while(newStr[i-p[i]] == newStr[i+p[i]]) p[i]++; //扩充p[i]的边界
            if(p[i]+i > mx){
                mx = p[i]+i;
                id = i;
            }
            if(p[i] > maxplen){//更新p[]的最大值
                maxpid = i;
                maxplen = p[i];
            }
        }
        for(i=maxpid-maxplen+1;i<=maxpid+maxplen-1;i++){
            if(newStr[i] == '#') continue;
            else ans.push_back(newStr[i]);
        }
        return ans;
    }
};

解法二:leetcode上Feb 20的答案,不需要附加“#”:

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length(), i;
        if(n<2)
            return s;

        int leftMost=0, rightMost=0;
        i = 0;
        int start, end;
        while(i<n)
        {
            start = i;
            end = i;
            i++;
            while(i<n && s[i]==s[start])
            {
                i++;
            }
            end = i-1;

            while(start-1>=0 && end+1<n && s[start-1]==s[end+1])
            {
                start--;
                end++;
            }

            if(rightMost-leftMost <= end-start)
            {
                leftMost = start;
                rightMost = end;
            }
        }

        return s.substr(leftMost, rightMost-leftMost+1);
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值