求两个字符串的最长公共子序列
公共子序列的定义:如字符串和字符串,公共子序列就有等
dp解法:
设表示直至第一个串的第位,第二个串的第位为止的最长公共子序列
可以推导出状态转移方程:
当第一个串的第个字符等于第二个串的第个字符时,
否则就继承以前的状态,也就是
这种朴素的算法时间复杂度显然是同样朴素的
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.
稍微看一看就可以发现的状态只会由转转移过来,也就是说,其实数组只需要一维,那么空间复杂度就会由降低为。
设来存储上一个状态
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.
来源:CSDN
作者:i小Rock
链接:https://blog.csdn.net/weixin_41221124/article/details/103963340