最长公共子串

最长公共子序列和最长公共子串区别

最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别:

子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。

例如  X = {a, Q, 1, 1}; Y = {a, 1, 1, d, f}

那么,{1, 1}是X和Y的最长公共字串。

思路

我们的目的是寻找两个顺序绝对一致的序列

所以我们需要构建一个二维数组进行统计,记录遍历的时候他们相同的地方

设有这样的两个序列:

{A,A,C,G,T,T,A,G}

{A,C,G,T,A}

 第一行的意思可以看作空和空.空和A。。。的最长子序列都为0

从第二行开始,如果相同就将左上角的值复制加一填入,所以这里就填上   1(0+1)

 到C的时候,A和C是不一样的,直接填入0

 

 到下一个A又相同,就把左上角的值加一填入

 之后不一样的都填入0

到第二行时,C与C一样了,填入左上角的元素值加一,也就是1+1= 2,填入2

填完后得到

 很明显表中的最大值就是他的最长子串

状态转移方程代码

 通过以上的分解后,我们可以得到这样一个状态转移方程

if(a===b){
table[row][col] = table[row - 1][col - 1] + 1;//如果一样,我们找到他斜上角的那个值进行加一之后赋值
} else { 
table[row][col] = 0; //如果不相同,我们就填入0
}

返回存储的序列信息

得到数组后得出序列就很容易了

设置一个函数为lcs,对得到的变化信息进行处理

找到数组里的最大数,就是最长子串长度,往左上递归到0就是他的序列

 如果读取到最大值时就说明在这里是最大的长度,向左上角的元素回溯

使用递归即可完成

 代码

最长公共子序列,差不多,前一个已经发了,改一下就行

posted @ 2022-11-10 23:34  kuailest  阅读(75)  评论(0编辑  收藏  举报