LeetCode 5

一、问题描述

Description:

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.

给一个字符串S,找出它的最长回文子串。假定S的最大长度是1000,并且存在唯一的最长回文子串。


二、解题报告

请看《最长回文子串的求解》。

首先,暴力解法就不用试了,这个肯定过不了。

然后我使用动态规划法,时间复杂度O(n2)

class Solution {
public:
    string longestPalindrome(string s) {
        int len = s.size();
        if(len <= 1) return s;
        // 动态规划表,全部初始化为true
        vector<vector<bool>> dp(len, vector<bool>(len, true));

        int start = 0, maxlen = 0;
        for(int k=2; k<=len; ++k) {    // 枚举子串的长度
            for(int i=0; i<=len-k; ++i) {  // 枚举子串起始位置
                int j = i+k-1;
                if(s[i] == s[j] && dp[i+1][j-1])
                {
                    dp[i][j] = true;
                    start = i;
                    maxlen = k;
                }
            }
        }

        return s.substr(start, maxlen);
    }
};

但是,出乎我的意料的是,居然超时了!!


最后采用中心扩展法 AC 了,虽然理论上时间复杂度也是O(n2),但可能因为系数更小,所以实际使用中速度更快。

class Solution {
public:
    // 分别向左右扩展,返回扩展后的字符串
    string expand(string s, int left, int right) {
        int len = s.size();
        while (left>=0 && right<len && s[left] == s[right]) 
        {
            left--;
            right++;
        }
        return s.substr(left+1, right-left-1);
    }

    string longestPalindrome(string s) {
        int len = s.size();
        if(len<=1) return s;

        string longest;
        for (int i=0; i<len-1; i++) 
        {
            string p1 = expand(s, i, i);  // 奇数
            if (p1.size() > longest.size())
                longest = p1;

            string p2 = expand(s, i, i+1);  // 偶数
            if (p2.size() > longest.size())
                longest = p2;
        }
        return longest;
    }
};





LeetCode答案源代码:https://github.com/SongLee24/LeetCode


原文地址:https://www.cnblogs.com/songlee/p/5738064.html