LCS笔记

不羁岁月 提交于 2020-01-22 08:27:17

求两个字符串的最长公共子序列
公共子序列的定义:如字符串abcdefabcdef和字符串efcabdefcabd,公共子序列就有ab,cd,ef,abdab,cd,ef,abd


dp解法:
f[i][j]f[i][j]表示直至第一个串的第ii位,第二个串的第jj位为止的最长公共子序列
可以推导出状态转移方程:
当第一个串的第ii个字符等于第二个串的第jj个字符时,f[i][j]=f[i1][j1]+1f[i][j]=f[i-1][j-1]+1
否则就继承以前的状态,也就是f[i][j]=max(f[i1][j],f[i][j1])f[i][j]=max(f[i-1][j],f[i][j-1])

这种朴素的算法时间复杂度显然是同样朴素的O(nm)O(nm)

model

uses math;
Var i,j,len1,len2:longint;
    s1,s2:string;
    a,b:array[0..1005] of longint;
    f:array[0..1005,0..1005] of longint;
Begin
        readln(s1);
        readln(s2);
        len1:=length(s1);
        len2:=length(s2);
        for i:=1 to len1 do
        Begin
                for j:=1 to len2 do
                Begin
                        if s1[i]=s2[j] then
                        Begin
                                f[i][j]:=f[i-1][j-1]+1;
                        end
                        else
                        Begin
                                f[i][j]:=max(f[i-1][j],f[i][j-1]);
                        end;
                end;
        end;

        write(f[len1][len2]);
end.

空间优化
稍微看一看就可以发现f[i][j]f[i][j]的状态只会由转f[i1][j1],f[i1][j]f[i][j1]f[i-1][j-1],f[i-1][j]和f[i][j-1]转移过来,也就是说,其实ff数组只需要一维,那么空间复杂度就会由O(nm)O(nm)降低为O(n)O(n)
prepre来存储上一个状态

uses math;
Var i,j,len1,len2,pre,tmp:longint;
    s1,s2:string;
    a,b:array[0..1005] of longint;
    f:array[0..1005] of longint;
Begin
        readln(s1);
        readln(s2);
        len1:=length(s1);
        len2:=length(s2);
        for i:=1 to len1 do
        Begin
                pre:=0;
                for j:=1 to len2 do
                Begin
                        tmp:=f[j];
                        if s1[i-1]=s2[j-1] then
                        Begin
                                f[j]:=pre+1;
                        end
                        else
                        Begin
                                f[j]:=max(f[j],f[j-1]);
                        end;
                        pre:=tmp;
                end;
        end;

        write(f[len2]);
end.
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!