問題描述 我們稱序列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的子串行。
解題思路
很容易分析出遞推關係:(s1,s2為兩個字串,i,j分別為他們的串字元下標)用 s1i 表示 s1 的前 i
個字元所構成的子串, s2j表示 s2 的前 j 個字元構成的子串,maxlen(i, j)表示 s1i 和 s2j的最長公共子串行的長度
if( i ==0 || j == 0 )
else if( s1[i] == s2[j] )
maxlen(i, j) = maxlen(i-1, j-1 ) + 1;
else
非遞迴解法:(動態規劃)
遞迴解法:#define maxsize 20
#define max(a,b) (a)>(b)?(a):(b)
int dp_lcs()
for(j=0;j<=len2;j++)
//dp to run lcs
for(i=1;i<=len1;i++)else
}}//end main_for
return maxlen[len1][len2];
}
#includeint lcs(char *str1,char *str2)elseelse
}}int main()
LCS最長公共子串行
求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...
LCS最長公共子串行
lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...
最長公共子串行(LCS)
首先要明確的是子串行的概念,注意啦,子串行不等於子串。子串行是乙個字串s去掉零個或者多個字元後所剩下的字串就叫做子串行。最長公共子串行的意思就是尋找兩個給定字串的的子串行,該子串行在兩個字串中以相同的次序出現,但是不一定是連續的。連續的那是子串 例如序列x abcbdab,y bdcaba。序列bc...