Algorithm 寻找最长公共序列

Algorithm 寻找最长公共序列,algorithm,Algorithm,我读了这篇文章,找到了两个给定字符串之间最长的共同点 我开始了解一种算法,其代码如下: for(int i=0;i<=n;i++) for(int j=0;j<=m;j++){ if(i==0 || j==0) dd[i][j]=0; else if(a[i-1]==b[j-1]) dd[i][j] = 1 + dd[i-1][j-1]; else{ dd[i][j] = Mat

我读了这篇文章,找到了两个给定字符串之间最长的共同点

我开始了解一种算法,其代码如下:

for(int i=0;i<=n;i++)
    for(int j=0;j<=m;j++){

        if(i==0 || j==0) dd[i][j]=0;
        else if(a[i-1]==b[j-1])
            dd[i][j] = 1 + dd[i-1][j-1];
        else{
            dd[i][j] = Math.max(dd[i-1][j], dd[i][j-1]);
        }
    }
for(int i=0;ilet

这里
n=3
m=4

The outer loop is for str1 and inner loop is for str2
  • 第一次迭代用于初始化数组
以下是
dd
数组的第一个外观:

0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
  • 在外循环的第二次迭代中,它将整个str2与str1的第一个字符进行比较,即
    “dabc”与“b”
现在,当
'b'
“dabc”
进行比较时,我们看到在第4次迭代时会有一个匹配,因此数组值将相对于当前位置的角点值进行更改。当前位置是
[1][3]
。当角点
([0][2])
值是
0
,当前值将是
1

0, 0, 0, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 2
0, 1, 0, 0, 0
迭代结束时,数组将如下所示:

0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 1, 1, 1, 2
位置
[1][4]
的值已更改,因为如果
str2
的字符与
str1
的当前字符不匹配,则当前位置的值将是当前位置左上方位置之间的最大值。此处的最大值为
1

现在检查您自己,如果
str1=“b”
最大匹配将为1。也就是说,我们计算每个迭代中
str1
的每个条目的最大匹配。

  • 在外循环的第三次迭代中,它再次将整个str2与str1的第二个字符进行比较,即
    “dabc”与“c”
现在,在第5次迭代中将有一个匹配,因此数组值将相对于当前位置的角点值进行更改。当前位置是
[2][4]
。由于角点
([1][3])
值是
1
,当前值将是
2

0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 0, 0, 0, 0
现在检查您自己,如果
str1=“bc”
最大匹配将为2。也就是说,我们计算每个迭代中
str1
的每个条目的最大匹配。

迭代结束时,数组将如下所示:

0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 1, 1, 1, 2
  • 在外循环的第4次迭代中,它再次将整个str2与str1的第3个字符进行比较,即
    “dabc”与“d”
现在在第二次迭代中会有一个匹配,因此数组值将相对于当前位置的角点值进行更改。当前位置是
[3][1]
。当角点
([2][0])
值是
0
,当前值将是
1

0, 0, 0, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 2
0, 1, 0, 0, 0
不会发生进一步的匹配

迭代结束时,数组将如下所示:

0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 0, 0, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 1, 1, 1, 2
所以这两个字符串的LCS是
dd[3][4]=2

希望你明白这一点。你也可以从


注意:这里我只描述了匹配情况。如果
str2
的一个字符与
str1
的当前字符不匹配,那么当前位置的值将是当前位置的左上方位置之间的最大值。您自己试试,您就会明白我们为什么这样做:)

如果你用谷歌搜索,你可以找到很多资源

这是第一个链接[单词对齐]。动画有很好的解释

你试过阅读这本书吗?