516. Longest Palindromic Subsequence

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int longestPalindromeSubseq(String s) {
int n = s.length();

// 定义 dp[i][j] 为子串 s[i, j] 中最长回文子序列的长度
int[][] dp = new int[n][n];
for (int i = n - 1; i >= 0; i--) {
dp[i][i] = 1; // 单个字符组成的子串为回文子序列
for (int j = i + 1; j < n; j++) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
// 如果两个端点字符不同,则 s[i, j] 不可能为回文子序列,只能选择删除左边字符或者右边字符
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}

return dp[0][n - 1]; // 注意此处返回整个字符串中的回文子序列长度
}
}

References

516. Longest Palindromic Subsequence