問題描述
我們稱序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列當且僅當存在嚴格上升的序列< i1, i2, ..., ik >,使得對j = 1, 2, ... ,k, 有xij = zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。
現在給出兩個序列X和Y,你的任務是找到X和Y的最大公共子序列,也就是說要找到一個最長的序列Z,使得Z既是X的子序列也是Y的子序列。
輸入數據
輸入包括多組測試數據。每組數據包括一行,給出兩個長度不超過200的字符串,表示兩個序列。兩個字符串之間由若干個空格隔開。
輸出要求
對每組輸入數據,輸出一行,給出兩個序列的最大公共子序列的長度。
解題思路
如果我們用字符數組s1、s2存放兩個字符串,用s1[i]表示s1中的第i個字符,s2[j]表示s2中的第j個字符(字符編號從1開始,不存在“第0個字符”),用s1i表示s1的前i個字符所構成的子串, s2j表示s2的前j個字符構成的子串,MaxLen(i, j)表示s1i 和s2j的最長公共子序列的長度,那麼遞推關係如下:
if( i ==0 || j == 0 ) {
MaxLen(i, j) = 0 //兩個空串的最長公共子序列長度當然是0
}
else if( s1[i] == s2[j] )
MaxLen(i, j) = MaxLen(i-1, j-1 ) + 1;
else {
MaxLen(i, j) = Max( MaxLen(i, j-1), MaxLen(i-1, j));
}