代码随想录训练营第五十七天|647.回文子串、516.最长回文子序列

news/2024/12/2 19:59:24/

647.回文子串

链接:LeetCode647.回文子串

  1. 确定dp数组以及下标含义。dp[i][j]表示下标为[i,j]的子字符串是否是回文串。
  2. 确定递推公式。如果s[i]==s[j]并且子字符串的长度为1或者2那么该子字符串一定是回文串;如果子字符串的长度大于2,并且下标为[i+1,j-1]的子字符串是回文串,那么该子字符串也是回文串,综上所述,递推公式为:
    if(s[i]==s[j] && (j-i<=1 || dp[i+1][j-1])) dp[i][j]=true;
  3. 数组初始化。dp[i][i] = true;
  4. 确定遍历顺序。dp[i][j]是由dp[i+1][j-1]推出的,子字符串的起始位置从后往前遍历,子字符串的结束位置从前往后遍历。
  5. 举例推导dp数组
class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.length(),vector<bool>(s.length(),false));for(int i=0;i<s.length();++i) dp[i][i]=true;int ans = 0;for(int i=s.length()-1;i>=0;--i){for(int j=i;j<s.length();++j){if(s[i]==s[j]&&(j-i<=1 || dp[i+1][j-1])) {++ans;dp[i][j]=true;}//cout << ans << "  ";}}return ans;}
};

516.最长回文子序列

链接:LeetCode516.回文子序列

  1. 确定dp数组以及下标含义。dp[i][j]表示下标为[i,j]的子字符串中最长回文序列的长度。
  2. 确定递推公式。如果s[i]==s[j] dp[i][j] = dp[i+1][j-1]+2(这里不需要去考虑下标[i+1,j-1]的子字符串是否是回文串,因为要求的回文序列);如果s[i]!=s[j] 单独考虑dp[i+1][j] 与 dp[i][j-1]并取其中的最大值。递推公式如下:
    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]);
  3. 数组初始化。dp[i][i] = 1;
  4. 确定遍历顺序。dp[i][j]是由dp[i+1][j-1]推出的,子字符串的起始位置从后往前遍历,子字符串的结束位置从前往后遍历。
  5. 举例推导dp数组
class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.length(),vector<int>(s.length(),0));for(int i=0;i<s.length();++i) dp[i][i] = 1;for(int i=s.length()-1;i>=0;--i){for(int j=i+1;j<s.length();++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.length()-1]; }
};

http://www.ppmy.cn/news/730824.html

相关文章

苹果手机主板芯片_团结来到苹果芯片

苹果手机主板芯片 At WWDC, Apple announced the next evolution of the Mac. To ensure your games are future-proof, Unity has been working closely with Apple to get our macOS Standalone player up and running on Macs with Apple silicon. Unity will support Unive…

人体扫描新技术:手机扫描生成3D人体模型

人体扫描是一种新兴的技术&#xff0c;它可以通过数字化的方式&#xff0c;再现人体的内部结构。这种模型的应用范围广泛&#xff0c;不仅可以应用于医学领域&#xff0c;还可以用于虚拟现实、游戏开发等各个领域。通过人体扫描生成模型&#xff0c;我们可以实时地观察人体内部…

rtp序号,时间戳的会绕问题

问题 在使用RTP协议时&#xff0c;我们需要通过序列号以及时间戳的比较&#xff0c;进行丢包判断。但是有个问题&#xff0c; 比如一个RTP包&#xff0c;序列号为4890&#xff0c;另一个RTP包序列号为59900&#xff0c;可以说59900一定比4890大&#xff0c;是个更新的RTP包吗&…

六轴机械臂搬运仿真(机器人工具箱)

1、建立机械臂模型 工作台、货物 clear close all clc L(1)Link(d, 0.33, a,0 , alpha, pi/2,offset,pi); L(2)Link(d, 0, a, 0.26, alpha,0,offset,pi/2); L(3)Link(d, 0, a, 0.02, alpha,pi/2,offset,0); L(4)Link(d, -0.29, a, 0, alpha,pi/2,offset,0); L(5)Link(d, 0, a,…

【Scrcpy】Scrcpy投屏报错 Exception on thread Thread[main,5,main] 的原因

【Scrcpy】Scrcpy投屏报错 Exception on thread Thread[main,5,main] 的原因 项目场景&#xff1a; 在执行scrcpy的时候&#xff0c;Scrcpy投屏报错 Exception on thread Thread[main,5,main] 的原因 原因分析&#xff1a; scrcpy版本和手机的兼容问题投屏分辨率太高&#xf…

ubuntu下开启/禁用笔记本触摸板

禁用笔记本触摸板&#xff1a;sudo rmmod psmouse&#xff1b; 开启笔记本触摸板&#xff1a;sudo modprobe psmouse&#xff1b;

在Ubuntu/Debian下禁用笔记本触控板

如果使用外接键盘&#xff0c;那禁不禁没啥关系。但是咱还是习惯笔记本键盘的。不过打字的时候手老是碰到笔记本那该死的触控板&#xff0c;想办法禁用他才是王道。因为在linux没有像windows那样的UI工具来帮助我们禁用他&#xff0c;不过咱还是一样可以把触控板给禁用了&#…

Ubuntu下开机禁用笔记本触摸板

Ubuntu下开机禁用笔记本触摸板 https://blog.csdn.net/kellncy/article/details/53573526