647. 回文子串
一开始我想的dp[i]表示到i为止有多少回文子串,但返现这样推到不出任何dp之间的关系。
而如果把dp[i][j]定义为i到j之间是否是回文子串的话。
则dp[i][j]和dp[i+1][j-1]是有关系的。
if(s[i]==s[j]&&j-i>=0){
if(j-i<=1){
dp[i][j]=true;
}
else{
if(dp[i+1][j-1])
dp[i][j]=true;
}
}
注意到此时它依赖的是矩阵中左下角的dp所以遍历顺序是从左到右,从下至上。
因为要保证j一定>=i,所以初始化时j=i
for(int i=n-1;i>=0;i--){
for(int j=i;j<n;j++){
516.最长回文子序列
如果i和j相等,那就是dp[i+1][j-1]+2.
如果不相等,则从dp[i+1][j]和dp[i][j-1]中选择一个
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n=s.size();
vector<vector<int>> dp(n,vector<int>(n,1));
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
if(s[i]==s[j]){
if(j-i>1)
dp[i][j]=dp[i+1][j-1]+2;
else
dp[i][j]=2;
}
else
dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
}
}
return dp[0][n-1];
}
};
这里我和代码随想录的初始化方式不同,我直接把所有初始化成1了,所以要单独讨论两个相邻的i和j相等的情况,把它搞成2.