Longest Palindromic Subsequence
最长回文子序列, 首先这个子序列就是substring, 这题用dp做, dp[i][j]表示在substring(s, i, j)的最长回文子序列. 这时,有一下集中情况:
- i==j, 这时候就是一个字符,当前最长回文子序列是1
- i>j, 这时候越界了, 返回0
- i<j时, 我们需要判断i和j的字符是不是相同,
- 如果相同, 继续探索i+1和j-1的答案并且加上i和j作为答案,即+2
- 如果不同, 则当前的i和j无法构成回文, 因为我们需要的是longest,所以选择i+1和j-1之间较大的那个.
public class Solution {
public int longestPalindromeSubseq(String s) {
return rec(s,0,s.length() - 1, new Integer[s.length()][s.length()]);
}
private int rec(String s, int i, int j, Integer[][] memo) {
if(memo[i][j] != null)
return memo[i][j];
if(i > j)
return 0;
if(i == j)
return 1;
if(s.charAt(i) == s.charAt(j))
memo[i][j] = rec(s,i+1,j-1,memo)+2;
else
memo[i][j] = Math.max(rec(s,i+1,j,memo),rec(s,i,j-1,memo));
return memo[i][j];
}
}