[leetcode刷题系列]Longest Palindromic Substring

这个题至少是存在nlogn的解法的,利用后缀数组。是否存在O(n)的解法已经不记得了。印象中似乎是有O(n)。有兴趣的同学可以去研究下。

另外这个题还可以利用二分+哈希的做法去解,复杂度同样是nlogn.

由于nlogn的写法太长了。 而这个题目的n最大规模只是1000而已。所以就简单的优化了下。用了最坏情况下n^2的解法。

const static int MAXN = 1000 + 10;
string s;
int dp[MAXN][MAXN];

bool is(int i, int j){
    if(i >= j)
        return true;
    if(dp[i][j] != -1)
        return dp[i][j];
    if(s[i] != s[j])
        return dp[i][j] = 0;
    return dp[i][j] = is(i + 1, j - 1);
}

class Solution {
public:
    string longestPalindrome(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(s.size() <= 1)
            return s;
        ::s = s;
        memset(dp, 0xff, sizeof(dp));
        for(int i = s.size(); i >= 1; -- i)
            for(int j = 0; j + i - 1 < s.size(); ++ j)
                if(is(j, j + i - 1))
                    return s.substr(j, i);
        return s.substr(0, 1);
    }
};


你可能感兴趣的:([leetcode刷题系列]Longest Palindromic Substring)