一、题目
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
点击查看原题
难度级别: 中等
二、思路
1)动态规划
设立二维数组dp[i][j]
为s[i,j]
最长的回文子序列,可以得到状态转移方程:
由于该数组只依赖于本行和商议后状态,也可以优化成一维数组,从后向前遍历字符位置为i
,令dp[j]
为s[i,j]
最长的回文子序列
三、代码
1)动态规划
class Solution {
public int longestPalindromeSubseq(String s) {
char[] cs = s.toCharArray();
int[][] dp = new int[cs.length][cs.length];
for (int i = cs.length - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int j = i + 1; j < cs.length; j++) {
if (cs[i] == cs[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][cs.length - 1];
}
}
时间复杂度为O(n^2)
,空间复杂度为O(n^2)
class Solution {
public int longestPalindromeSubseq(String s) {
char[] cs = s.toCharArray();
int[] dp = new int[cs.length];
for (int i = cs.length - 1; i >= 0; i--) {
int[] temp = dp;
dp = new int[cs.length];
dp[i] = 1;
for (int j = i + 1; j < cs.length; j++) {
if (cs[i] == cs[j]) {
dp[j] = temp[j-1] + 2;
} else {
dp[j] = Math.max(temp[j], dp[j-1]);
}
}
}
return dp[cs.length - 1];
}
}
时间复杂度为O(n^2)
,空间复杂度为O(n)