【LeetCode-5】最长回文子串

问题

给你一个字符串 s,找到 s 中最长的回文子串。

示例

输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。

解答1:动态规划

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size(), maxLen = 1, start = 0;
        bool dp[n][n]; memset(dp, true, sizeof(dp));
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) { // 结束位置
                dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1];
                if ((j - i + 1 > maxLen) && dp[i][j]) {
                    maxLen = j - i + 1;
                    start = i;
                }
            }
        } // 起始位置
        return s.substr(start, maxLen);
    }
};

重点思路

使用dp[i][j]描述以i为起点,j为终点的字符串是否为回文串。很容易想到dp[i][j]dp[i-1][j-1]有关系,可以依此写出状态转移方程。

这里特别要注意二维动态规划的顺序,即外层循环代表起始位置还是结束位置。我们一定要保证状态转移方程中右边式子中的变量已经被处理过。

解答2:中心拓展法

class Solution {
public:
    string longestPalindrome(string s) {
        for (int i = 0; i < s.size(); i++) {
            check(s, i, i);
            check(s, i, i + 1);
        }
        return s.substr(start, maxLen);
    }
private:
    int maxLen = 1, start = 0;
    void check(string& s, int i, int j) {
        while (i >= 0 && j < s.size() && s[i] == s[j]) {
            if (j - i + 1 > maxLen) {
                maxLen = j - i + 1;
                start = i;
            }
            j++;
            i--;
        }
    }
};

解答3:Manacher算法

Manacher算法

posted @ 2021-03-09 12:27  tmpUser  阅读(47)  评论(0编辑  收藏  举报