LCS 算法的改进

来源:互联网 发布:刀剑乱舞 pocket 数据 编辑:程序博客网 时间:2024/05/08 08:08

通常两个字符串的最大公共子串的问题是通过下面的算法来完成的: 把字符串1(长度m)横排,串2(长度n)竖排,得到一个m×n的矩阵c,矩阵的每个元素的值如下,如果m[i]=n[j],则c[j][i]=1,否则,c[j][i]=0。然后找出矩阵中连续是1的对角线最长的一个,则对角线的长度就是公共子串的长度.

一看这个方法就会发现一些问题,好处是这个算法很简单,实现也比较容易,缺点却是:1、时间复杂度大于 O(n*m) 在生产map 表之后,还需要对map 表进行搜索,得到最大对角线。2、需要生成一个n×m 的map 表,比较浪费空间。 无论从运行时间还是从空间的角度来看都有一些问题。 其实这个算计可以进行一定的改进。

1. 没有必要生成这个map 表,只要定义两个标量记录一下起始的位置和长度就ok 了

2、从一个串中取出元素顺序的和另外一个串比较。记录起始位置和长度,判断一下是不是比前一个记录的长,如果比前一个长就保存当前的这个记录。

这样下来算法的时间复杂度就是O(n*m) ,基本不需要额外的空间。