力扣:516.最长回文子序列

news/2024/9/22 5:58:22/

一开始以为是最长回文子串,这题就跟上题基本一致了,代码如下。但是题目所说的是最长回文子序列,此时就相当于做了两题了。
最长回文子串代码:

class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<bool>>dp(s.size(),vector<bool>(s.size(),false));int result = 1; for(int i = s.size()-1; i >= 0; --i){for(int j = i; j < s.size(); ++j){if(s[i] == s[j]) {if(j - i <= 1){dp[i][j] = true;}else if(dp[i+1][j-1]){dp[i][j] = true;if(j - i+1 > result) result = j-i+1;}}}}return result;}
};

最长回文子序列:

力扣:516.最长回文子序列
题目:
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

解析:
然后还是很简单的,几分钟的事,还是首先通过for循环确定为二维dp数组,然后其含义为题目目的即 i ~ j 的最长回文子序列长度。然后脑海中举一个例子,然后考虑所有情况,用dp数组将其表示出来。

递归公式:

  • 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;
  • 如果s[i]与s[j]不相同最长回文序列有两种情况,包含 i 的,包含 j 的,所以只需要进行比较即可。

初始化:
因为在递归公式中。当s【i】 == s【j】这种情况中其dp就默认了 i j 之间的长度大于1。所以应该考虑为 j - i 为1的情况。主观来看很明显应该是1。然后按照含义,递归公式,模拟遍历来初始化。此时按照含义即可初始化完成。其他情况dp[i][j]初始为0就行,这样递推公式:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); 中dp[i][j]才不会被初始值覆盖。

递归顺序:
与上题分析一致。

最长回文子序列代码:

class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));for(int i  = 0; i < s.size(); ++i) dp[i][i] = 1;for(int i = s.size()-1; i >= 0; --i){for(int j = i+1; j < s.size(); ++j){if(s[i] == s[j]){dp[i][j] = 2+dp[i+1][j-1];                   }else {dp[i][j] = max(dp[i+1][j],dp[i][j-1]);}}}return dp[0][s.size()-1];}
};

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

相关文章

D-OJ刷题日记:有向图的邻接表表示法验证程序 题目编号:516

用邻接表表示有向图&#xff0c;完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型&#xff0c;图中顶点序号按字符顺序排列&#xff0c;边的输入按照边的顶点序号从小到大的顺序排列&#xff0c;如下图的边的输入顺序为0 1&#xff0c;0 2&…

LeetCode:516. 最长回文子序列

516 最长回文子序列 给定一个字符串s&#xff0c;找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入: “bbbab” 输出: 4 一个可能的最长回文子序列为 “bbbb”。 示例 2: 输入: “cbbd” 输出: 2 一个可能的最长回文子序列为 “bb”。 1 解法1&#xff1…

leetcode 516:最长回文子序列

leetcode 516. 最长回文子序列 题目描述&#xff1a;给定一个字符串s&#xff0c;找到其中最长的回文子序列。可以假设s的最大长度为1000。 解题步骤&#xff1a;解决此类问题可以采用动态规划 dp[i][j]表示从第i个字符到第j个字符之间的最长回文子串。该问题类似于01背包问题 …

ios拷贝文件,error code 516

今天写了一段拷贝文件的代码&#xff1a; NSBundle *bundle[NSBundle mainBundle];NSString *srcPath[bundle pathForResource:"images" ofType:"zip"];// Bundle内的images.zip文件NSString *enterprisePath [imagesPath stringByAppendingPathComponent…

LeetCode——516. 最长回文子序列

题目描述&#xff1a; 给定一个字符串 s &#xff0c;找到其中最长的回文子序列&#xff0c;并返回该序列的长度。可以假设 s 的最大长度为 1000 。 提示&#xff1a; 1 < s.length < 1000s 只包含小写英文字母 示例 1: 输入: “bbbab” 输出: 4 一个可能的最长回文子…

LC 516 最长回文子序列

LC 516 最长回文子序列 题目: 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 输入&#xff1a;s "bbba…

516. 最长回文子序列之终极版

问题描述 给定一个字符串s&#xff0c;找到其中最长的回文子序列。可以假设s的最大长度为1000。 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bbbb"。 示例 2: 输入: "cbbd" 输出: 2 一个可能的最长回文子序列为 "bb"…

516. 最长回文子序列 动态规划

给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s "bbbab" 输出…