最长公共子序列 LCS (Leetcode1143 & 516)
given s1, s2
r[i,j] = r[i-1,j-1]+1 if s1[i] == s2[j];
= max(r[i-1][j], r[i][j-1]) else;
自上而下递归比较耗时
最好还是用空间换时间 r[M-1][N-1]
然后初始化 r[0][j]和r[i][0] 即可
-----------------------------------------
最长回文子序列
逆转,再求LCS即可
class Solution {
public:
int longestPalindromeSubseq(string s) {
string r;
r.assign(s);
reverse(s.begin(), s.end());
int m = s.size();
// r[i,j] = max(r[i-1][j],r[i][j-1]) else
// = r[i-1][j-1] if s1[i]==s2[j]
int record[m][m] =0;
// Initialize
for(int i=0;i<m;i++){
record[i][0] = 0;
record[0][i] = 0;
}
if(s[0]==r[0])
record[0][0] = 1;
for(int i=1;i<m;i++){
if(s[i]==r[0])
record[i][0] = 1;
else
record[i][0] = record[i-1][0];
}
for(int j=1;j<m;j++){
if(s[0]==r[j])
record[0][j] = 1;
else
record[0][j] = record[0][j-1];
}
// Forward
for(int i=1;i<m;i++)
for(int j=1;j<m;j++){
if(s[i] == r[j])
record[i][j] = record[i-1][j-1]+1;
else
record[i][j] = max(record[i-1][j], record[i][j-1]);
}
return record[m-1][m-1];
}
};