# 力扣第47天— 第647题、第516题
逻辑梳理清楚了,就还行。没有想象中那么难。注意遍历顺序,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;
}
};
还可以吧,跟上一题差不多。遍历顺序一样,但是要注意,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];
}
};