516. 最长回文子序列(一般)
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。
示例 1:
输入:"bbbab"
输出:4
一个可能的最长回文子序列为 “bbbb”。
示例 2:
输入:"cbbd"
输出:2
一个可能的最长回文子序列为 “bb”。
提示:
1 <= s.length <= 1000
s 只包含小写英文字母
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence
思路:
动态规划,dp[i ] [j]表示为最长回文子串的长度
代码1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public int longestPalindromeSubseq(String s) { int len = s.length(); int[][] dp = new int[s.length()][s.length()]; for(int i=0;i<len;i++){ dp[i][i]=1; } for(int i=len-1;i>=0;i--){ for(int j=i+1;j<len;j++){ if(s.charAt(i)==s.charAt(j)){ dp[i][j]=dp[i+1][j-1]+2; }else{ dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]); } } } return dp[0][len-1]; } }
|
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public int longestPalindromeSubseq(String s) { int len = s.length(); int[] dp = new int[s.length()]; for(int i=0;i<len;i++){ dp[i]=1; } for(int i=len-1;i>=0;i--){ int pre = 0; for(int j=i+1;j<len;j++){ int temp = dp[j]; if(s.charAt(i)==s.charAt(j)){ dp[j]=pre+2; }else{ dp[j]=Math.max(dp[j],dp[j-1]); } pre = temp; } } return dp[len-1]; } }
|