# 5 - Longest Palindromic Substring

解法一 - DP

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length();
        vector<vector<bool>> dp(n, vector<bool>(n, false));

        // Init one-letter and two-letter cases
        for(int i=0; i<n; i++) 
            for(int j=0; j<n; j++) 
                if(j-i < 2) dp[i][j] = (s[i] == s[j]);

        // Recurrence
        for(int i=n-3; i>=0; i--) {
            for(int j=i+2; j<n; j++) {
                dp[i][j] = dp[i+1][j-1] && (s[i] == s[j]);
            }
        } 

        // Get the answer
        string res = s.substr(0,1);
        int maxL = 1;
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(dp[i][j] && (j-i+1)>maxL) {
                    maxL = j-i;
                    res = s.substr(i, j-i+1);
                }
            }
        }

        return res;
    }
};

可以稍微修改一下程式碼,合併 Init 跟 Recurrence 的地方:

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length();
        vector<vector<bool>> dp(n, vector<bool>(n, false));

        // Recurrence
        for(int i=n-3; i>=0; i--) {
            for(int j=i+2; j<n; j++) {
                dp[i][j] = (j-i<2 || dp[i+1][j-1]) && (s[i] == s[j]);
            }
        } 

        // Get the answer
        string res = s.substr(0,1);
        int maxL = 1;
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(dp[i][j] && (j-i+1)>maxL) {
                    maxL = j-i;
                    res = s.substr(i, j-i+1);
                }
            }
        }

        return res;
    }
};

Last updated