本文主要是介绍516. 最长回文子序列【leetcode】/动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
516. 最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
提示:
1 <= s.length <= 1000
s 仅由小写英文字母组成
动态规划
将这道题看成求一个字符串和它的反转串的最长公共子序列
class Solution {
public:int dp[1005][1005];int longestCommonSubsequence(string text1, string text2) {int m=text1.size(),n=text2.size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){int same=(text1[i]==text2[j])?1:0;if(i==0&&j==0) dp[i][j]=same;else if(i==0) dp[i][j]=dp[i][j-1]||same;else if(j==0) dp[i][j]=dp[i-1][j]||same;else if(same) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}return dp[m-1][n-1];}int longestPalindromeSubseq(string s) {string temp=s;reverse(s.begin(),s.end());return longestCommonSubsequence(s,temp);}
};
这篇关于516. 最长回文子序列【leetcode】/动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!