您的位置:首页 > 新闻 > 热点要闻 > 代码随想录训练营day46|647. 回文子串,516.最长回文子序列

代码随想录训练营day46|647. 回文子串,516.最长回文子序列

2025/5/25 21:17:04 来源:https://blog.csdn.net/wwwgxd/article/details/142167998  浏览:    关键词:代码随想录训练营day46|647. 回文子串,516.最长回文子序列

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;elsedp[i][j]=2;}elsedp[i][j]=max(dp[i][j-1],dp[i+1][j]);}}return dp[0][n-1];}
};

这里我和代码随想录的初始化方式不同,我直接把所有初始化成1了,所以要单独讨论两个相邻的i和j相等的情况,把它搞成2.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com