Loading

[LeetCode]5. 最长回文子串

题目


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

示例 1:

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

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

代码


class Solution {
public:
    string longestPalindrome(string s) {
        int stepEven=0;
        int stepOdd=0;
        int max=0;
        int isOdd=false;
        int pos=0;
        for(int i=0;i<s.length();i++)
        {
            //奇数
            for(int step=0;(i-step>=0)&&(i+step<s.length());step++)
            {
                if(s[i-step]!=s[i+step])
                    break;
                stepOdd=step*2+1;
            }

            if(stepOdd>max)
            {
                max=stepOdd;
                isOdd=true;
                pos=i;
            }
            //偶数
            for(int step=1;(i-step+1>=0)&&(i+step<s.length());step++)
            {
                if(s[i-step+1]!=s[i+step])
                    break;
                stepEven=step*2;
            }
            if(stepEven>max)
            {

                max=stepEven;
                isOdd=false;
                pos=i;
            }

        }
        string result;
        if(isOdd)
        {
            result=s.substr(pos-(max-1)/2,max);

        }
        else
        {
            result=s.substr(pos-max/2+1,max);
        }
        return result;

    }
};

思路


采用中心扩展法,一共要考虑两种情况:第一种就是回文字符串长度为奇数,从最中间的那个字符开始比较的话是比较它左右的字符串,比如"11322",从3开始比较;第二种就是回文字符串长度为偶数,如果是"2112"的话,那么最开始比较的是第一个1;比较完后返回字符串的时候要分别考虑奇偶来切分子串。

posted @ 2018-04-26 20:29  李正浩  阅读(64)  评论(0编辑  收藏  举报