leetcode 最长回文子串 中等

 

 

方法一:马拉车算法。https://www.cnblogs.com/rookie-acmer/p/15188550.html

方法二:dp,dp[i][j] 表示 [i, j] 是否为回文字符串。dp[i][j] = dp[i + 1][j - 1] && (s[i] == s[j])。。

需要注意枚举方式,枚举回文串的长度,然后枚举串的起点!而不是直接枚举串的起点和终点

class Solution {
public:
    string longestPalindrome(string s) {
        memset(dp, 0, sizeof(dp));
        int maxLen = -1, begIdx;
        for(int len = 0; len < s.size(); ++ len) {
            for(int i = 0; i < s.size() - len; ++ i) {
                int j = i + len;
                if(len == 0) dp[i][j] = true;
                else if(len == 1) dp[i][j] = s[i] == s[j];
                else {
                    dp[i][j] = dp[i + 1][j - 1] & (s[i] == s[j]);
                }
                if(dp[i][j] && maxLen < len) {
                    maxLen = len;
                    begIdx = i;
                }
            }
        }
        return s.substr(begIdx, maxLen + 1);
    }
    static const int maxn = 1e3 + 10;
    bool dp[maxn][maxn];
};

 

posted @ 2021-07-25 16:42  rookie_Acmer  阅读(27)  评论(0)    收藏  举报