力扣第47天--- 第647题、第516题

# 力扣第47天— 第647题、第516题

文章目录

  • 一、第647题--回文子串
  • 二、第516题--最长回文子序列

一、第647题–回文子串

​ 逻辑梳理清楚了,就还行。没有想象中那么难。注意遍历顺序,i从大到小。

class Solution {
public:
    int countSubstrings(string s) {
        vector> dp(s.size(), vector(s.size(), false));
        int result = 0;

        for (int i = s.size()-1; i>=0; i--){
            for (int j = i; j<= s.size()-1; j++){
                if(s[i] == s[j]) {
                    if (j-i <=1) {
                        dp[i][j] = true;
                        result++;
                    }
                    else {
                        dp[i][j] = dp[i+1][j-1];
                        if (dp[i][j]) result++;
                    }
                }
            }
        }
    return result;
    }
};

二、第516题–最长回文子序列

​ 还可以吧,跟上一题差不多。遍历顺序一样,但是要注意,j的遍历起点为i+1,因为递归的时候涉及到i+1,会导致越界。递推公式,要想一想,但是难度不大。

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector> dp(s.size(), vector(s.size(), 0));
        for(int i =0; i=0; i--){
            for (int j = i+1; j< s.size(); j++){
               // cout << dp[i][j] << '-';
                if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2;
                else dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
            }
        }
        return dp[0][s.size()-1];
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)