要求:
给定一个字符串s,找到其中最长的回文子序列。字串是字符串中连续的一个序列,子序列是字符串中保持相对位置的字符串序列。
示例:
输入:"bbbab"
输出:4
可能的最长回文子序列是"bbbb"
输入:"cbbd"
输出:2
可能的最长回文子序列是"bb"
思路:
动态规划:
- dp[s.length()][s.length()]:动态数组,dp[i][j]代表字符串索引
i,j之间最长回文子序列的长度; - base case:
i,j相等时,长度为1,即dp[i][i]=1 - 选择:若i,j相等,i前移,j后移;若i, j不相等,可能是i前移,可能是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])
代码:
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len][len];
for (int i = len - 1; i >= 0; i--) {
dp[i][i] = 1;
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];
}
}