動態規劃:最長公共子序列

問題描述

我們稱序列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));

}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章