647. 回文子串
题目链接:647. 回文子串 - 力扣(LeetCode)
文章讲解:代码随想录
思路:
以dp【i】表示以s【i】结尾的回文子串的个数,发现递推公式推导不出来此路·不通
以dp【i】【j】表示s【i】到s【j】的回文子串的个数,递推公式也推不出
正确 dp【i】【j】表示s【i】到s【j】是否为回文串
确定递归顺序:
dp【i】【j】依赖于dp【i+1】【j-1】因此 i从后往前遍历,j从前往后遍历
则最后秩序统计矩阵上三角为true的个数
class Solution {
public:int countSubstrings(string s) {vector<vector<bool>>dp(s.size(),vector<bool>(s.size(),false));int ans=0;for(int i=s.size()-1;i>=0;i--){ //这里实际上只修改上三角矩阵的值 for(int j=i;j<s.size();j++){if(s[i]==s[j]){if((i-j)<=1){dp[i][j]=true;ans++;}else{if(dp[i+1][j-1]==true){dp[i][j]=true;ans++;}}}}}return ans;}
};
516.最长回文子序列
题目链接:516. 最长回文子序列 - 力扣(LeetCode)
文章讲解:代码随想录
思路:
由于是要判断是否是回文,即要比较s【i】与s【j】显然用二维数组定义是合适的
dp[i][j]表示s【i】到s【j】的最长回文子序列的长度
推导递推公式
if(s[i]==s[j]){
j==i dp[i][j]=1
j-i=1 dp[i][j]=2
j-i>1 dp[i][j]=dp[i+1][j-1]+2
}else{
j-i=1 dp[i][j]=1
j-i>1 dp[i][j]=dp[i+1][j-1]
注意:这里是错的 考虑bba 或者abb 这里应该是dp【i】【j】=max(dp【i】【j-1】,dp【i+1】【j】)
遍历顺序:
与上题一样 i从大到小 j从小到大
初始化:直接初始化为1
class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>>dp(s.size(),vector<int>(s.size(),1));int size=s.size();for(int i=size-1;i>=0;i--){for(int j=i;j<s.size();j++){if(s[i]==s[j]){if(i==j){dp[i][j]=1;}if((j-i)==1){dp[i][j]=2;}if((j-i)>1){dp[i][j]=dp[i+1][j-1]+2;}}else{if((j-i)==1){dp[i][j]=1;}else{dp[i][j]=max(dp[i][j-1],dp[i+1][j]);}}}}return dp[0][s.size()-1];}
};
最后一天动态规划 开心!!!!!