引言
子序列和子字符串或者连续子集的不同之处在于,子序列不需要是原序列上连续的值。
对于子序列的题目,大多数需要用到DP的思想,因此,状态转移是关键。
这里摘录两个常见子序列问题及其解法。
例题1, 最长公共子序列
我们知道最长公共子串的求法,先温习一下,它的求法也是使用DP思想,对于 字符串s1 和字符串s2,令 m[i][j] 表示 s1上以s1[i]结尾的子串和s2上s2[j]结尾的子串的最长公共子串长度,因为公共子串必须是连续的,因此状态转移方程:m[i, j] = (s1[i] == s2[j] ? m[i-1, j-1] + 1 : 0)。因为m[i, j]的计算只需要用到 m[i-1, j-1],再之前的就用不着了,因此我们不必用一个二维数组来保存整个m[s1.length()][s2.length()],只需要保存并不断更新m[i-1, j-1]就可以了。
代码:
char *LCString(const char* s1, const char* s2){ if(NULL == s1 || NULL == s2) return NULL; int size1 = 0, size2 = 0; const char* head1 = s1; const char* head2 = s2; while(*(head1++) != '