Leetcode中级算法之最长回文子串(5)C++

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

示例 1:

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

输入: “cbbd”
输出: “bb”

这道题在网上看到了许多解法,如动态规划,马拉车解法,看得一知半解,最后找到一个求最长子串长度的解法,在它的基础上得到了如下通俗解法,时间复杂度为O(N^2)

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length();
        if(n < 1)   return "";
        int count=0, maxLen=0;  
        for(int i=0;i<n;i++)
        {
            for(int j=0;(i-j)>=0&&(i+j)<n;j++)	//当子串长度为奇数时
            {
                if(s[i-j] != s[i+j])    
                    break;
                count = 2 * j + 1;
                if(count > maxLen)
                    maxLen = count;
            }
            for(int k=0;(i-k)>=0&&(i+k+1)<n;k++)	//当子串长度为偶数时
            {
                if(s[i-k] != s[i+k+1])
                    break;
                count = 2 * k + 2;
                if(count > maxLen)
                    maxLen = count;		//到此步得到了原字符串的最长子串的长度maxLen
            }
        }
        for(int i=0;i<=n-maxLen;i++)	//从原数组截取maxLen长度的子串,为回文就返回
        {
            string longestSubstr = s.substr(i,maxLen);
            if(ishuiwen(longestSubstr))
                return longestSubstr;
        }
        
    }
    bool ishuiwen(string s)		//判断字符串是否为回文
    {
        if(s.length()<2)
            return true;
        int n = s.length();
        for(int i=0;i<n/2;i++)
            if(s[i] != s[n-i-1])
                return false;
        return true;
    }
};

思路:循环原字符串,以每一个字符为中点向左右遍历,得到最长子回文串的长度maxLen(注意子串长度的奇偶),然后截取maxLen长度的子串判断是否为回文即可.

猜你喜欢

转载自blog.csdn.net/Mr_Lewis/article/details/84653885
今日推荐