(Leetcode)5. Longest Palindromic Substring(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,直到检测到不相同为止。
       另一种情形是回文串是奇数位的,这种情况的话则遍历原子串,判断是否有当前位[I]与[I+2]位相同,如果有就开始前后检测,之后的操作与偶数位的情况相同。
       两种情形的检测都将与原最大串进行长度比较,若比原最大长则储存当前最大子串信息(包括长度与结束位),以便最后进行返回输出。
       值得留意的一种情况是全部字符都相同的情况如”bbbbb”,这时候若仅以某一种情况来检测都是有可能错的,例如第二位的b若以偶数情形来开始检测则最后只能得到”bbbb”的最长回文串,但实际上它也可以用奇数位情形来进行检测,因此对于用奇数位情形和偶数为情形来检测的情况不应该用if和else来区分,而应该属于均要检测的情况。

我的代码:

class Solution {
public:
    string longestPalindrome(string s) {
        int outcome = 0;
        int lo = 0;
        int curmax = 0;
        string x;
        if (s.size() <= 1)
            return s;

        for (int i = 0; i < s.size(); i++) {
            if(i>0&&s[i-1]==s[i+1]){
                curmax = 3;
                int j = 2;
                while (i - j>=0&&j+i<s.size()) {
                    if (s[i - j] == s[i + j]) {
                        curmax = curmax + 2;
                        j++;
                    }
                    else
                        break;
                }
                if (curmax > outcome) {
                    lo = i+j-1;
                    outcome = curmax;
                    if (outcome == s.size())
                        break;
                }
            }
            if(s[i]==s[i+1]){
                curmax = 2;
                int j = 1;
                while (i - j>=0 &&i + j<s.size()) {
                    if (s[i - j] == s[i + 1 + j]) {
                        curmax = curmax + 2;
                        j++;
                    }
                    else
                        break;
                }
                if (curmax > outcome) {
                    lo = i+j;
                    outcome = curmax;
                    if (outcome == s.size())
                        break;
                }
            }
        }
        for (int i = 0; i < outcome; i++) {
            x += s[lo - i];
        }
        return x;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值