【代码随想录】Day57 动态规划17 (回文子串、最长回文子序列)

第一题

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 二维dp数组,从下往上,从左往右推:

    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size(), vector<bool>( s.size(), false));
        int res = 0;
        for (int i = s.size()-1; i >= 0; i--) {
            for (int j = i; j < s.size(); j++) {
                if (s[i] == s[j]) {
                    if ((j-i) <= 1) {
                        dp[i][j] = true;
                        res++;
                    }
                    else if (dp[i+1][j-1] == true) {
                        dp[i][j] = true;
                        res++;
                    }
                }
                
            }
        }
        return res;
    }

第二题

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 

dp[i][j],i到j范围内的回文子序列长度

if (s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2; 

else dp[i][j] = max(dp[i][j-1] + 1, dp[i+1][j]);

if (i == j) dp[i][j] = 1;

最长回文子串

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

 

class Solution {
public:
    string longestPalindrome(string s) {
        vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
        int maxLen = 1, maxIndex = 0;
        for (int i = 0; i < s.size(); i++) {
            dp[i][i] = true;
        }
        for (int i = s.size()-1; i >= 0; i--) {
            for (int j = i+1; j < s.size(); j++) {
                if (s[i] == s[j]) {
                    if (j - i <= 1) {
                        dp[i][j] = true;
                    }
                    else if (dp[i+1][j-1] == true) {
                        dp[i][j] = true;
                    }
                    if (dp[i][j] == true  && (j - i + 1) > maxLen) {//只有当最长长度更新的时候,maxIndex才更新!!!
                    //并且!只有当s[i]==s[j]时,dp[i][j]才有可能是回文,所以一定要写在里面
                        maxLen = j - i + 1;
                        maxIndex = i;
                    }
                }
                
            }
        }
        return s.substr(maxIndex, maxLen);
    }
};

 

猜你喜欢

转载自blog.csdn.net/weixin_43785314/article/details/132702410