最长公共子序列:
给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列。
例如:Z=<a,b,f,c>是序列X=<a,b,c,f,b,c>的一个子序列,Z中的元素在X中的下标序列为<1,2,4,6>。
现给你两个序列X和Y,请问它们的最长公共子序列的长度是多少?
输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。
对于每组输入,输出两个字符串的最长公共子序列的长度。
输入样例
abcfbc abfcab
programming contest
abcd mnp
输出样例
4
2
0
这道题的要求是每个字符都要经过检验,但是如果用时间复杂度为O(n^2)的逐一遍历方法不用想都知道会TLE, 所以进一步想到动态规划,可以用记忆化数组保存之前的结果。
当第一个字符串s1的长度为n,第二个字符串s2长度为m时,设二位数组dp[n][m]使得:
dp[i][j]表示s1的前i个字符组成的字符串和s2的前j个字符组成的字符串所构成的最长公共子序列的长度。所以得出dp[][]的递推关系式:
s(i+1)和t(j+1)相等时:
而s(i+1)和t(j+1)不相等时,有两种选择,一种是从s1中选下一个,看看和ti是否相等,另一种就取
t中的下一个字符看看和si是否相等:然后取两者之中的最大值(都相等/不等也没有关系)
有这样的递推关系&#