区间dp, 从两侧向中间缩减范围, 子序列问题本质上是选或不选, 如果两侧的字母一致, 说明能都选, 状态 -> dfs(i+1, j-1), 如果两侧的字母不一致, 说明不能都选
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { char[] str; int[][] m;
public int longestPalindromeSubseq(String s) { str = s.toCharArray(); m = new int[s.length()][s.length()]; return dfs(0, s.length()-1); }
private int dfs(int i, int j) { if (i > j) return 0; if (i == j) return 1; if (m[i][j] != 0) return m[i][j]; if (str[i] == str[j]) return m[i][j] = dfs(i+1, j-1) + 2; return m[i][j] = Math.max(dfs(i, j-1), dfs(i+1, j)); } }
|