java最长公共子序列 最长公共连续子序列?
最长公共连续子序列?
最长公共子序列(LCS)是在一组序列(通常是两个序列)中查找最长子序列的问题。这与寻找最长公共子串的问题不同:子串不需要占据原始序列中的连续位置。最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序(如diff工具)和生物信息学应用的基础。它还广泛用于版本控制,例如git,以协调文件之间的更改。
公共子序列推导公式?
,最长的普通suB序列:LCS)
有两个序列a[1。。。M] 和B[1。。。N] ,分为子序列a[1]a[1。。2] a[1。。3]... A[1。。M
B[1]B[1。。2] B[1。。3] B[1。。n
依次计算a中的每个子序列(从a[1]开始)和B中每个子序列的最长公共子序列,并记录在数组C[M][n]中。C[i][J]表示a[1。。一] 和B[1。。J] 是的。
递推公式如下:
①C[i][J]=0,i=0或J=0
②C[i][J]=C[i-1][J-1]1,i!=0和j!=0和a[i]=B[J
]③C[i][J]=max{C[i-1][J],C[i][J-1]}i!=0和j!=0和[i
]路径记录:如何获得C[i][J]。根据递推公式,C[i][J]来自三个来源:C[i-1][J-1],C[i][J-1][J],C[i][J-1]。如果它是从C[I-1][J-1]导出的,那么a[I]=B[J]是最长公共子序列中的一个元素。
您可以设置数组P[M][n]来记录当前C[i][J]的获取方式。P[M][n]只有三个值,分别是1、2和3。
构造最长公共子序列:
递归检查P[i][J],初始i=m,J=n
如果P[i][J]=1,记录C[i][J],递归处理P[i-1][J-1
]如果P[i][J]=2,不记录,递归处理P[i-1][J
]如果P[i][J]=3,不记录,递归处理P[i][J-1
]直到i=0或J=0
时间复杂度:O(MN)
java最长公共子序列 java最长不重复子串 最长公共子序列算法
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。