最长公共子串

来源:互联网 发布:zepto.js 滑动 编辑:程序博客网 时间:2024/05/18 02:52

最长公共子串

【问题描述】
       一个给定序列的子序列是在该序列中删去若干元素后得到的序列。例如,序列Z=【B,C,D,B】是序列X=【A,B,C,B,D,A,B】的子序列;
       给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X,Y的公共子序列。
       例如,若X=【A,B,C,B,D,A,B】
                      Y=【 B, D, C, A, B, A】
       那么:【 B , C , A 】是X和Y的一个公共子序列
                  【B,C,B,A】是X和Y的一个公共子序列。
       编程求出给定的两个序列中,最长公共子序列的长度。
【输入格式】
       共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000。
【输出格式】
       一个整数,即两个序列的公共子序列的长度。

分析
       此题只需简单地运用一下动态规划的算法即可。不难发现它的子问题就是:
       f[i,j]=f[i-1,j-1]+1                  当i,j>0时,且xi=yj 时
       f[i,j]=Max( f[i,j-1], f[i-1,j] )  当i,j>0时,且xi≠yj 时

下面附上代码:

var f:array[0..1002,0..1002] of integer;    n,m,i,j:integer;    x,y:array[1..10000] of char;procedure init;begin    while not eoln do    begin        inc(n);        read(x[n]);    end;    readln;    while not eoln do    begin        inc(m);        read(y[m]);    end;end;function max(a,b:integer):integer;begin    if a>b then max:=a else max:=b;end;begin    init;    for i:=0 to n do        for j:=0 to m do            if (i=0) or (j=0) then  f[i,j]:=0                else if x[i]=y[j] then f[i,j]:=f[i-1,j-1]+1            else f[i,j]:=max(f[i-1,j], f[i,j-1]);    writeln(f[n,m]);end.
1 0
原创粉丝点击