LCS解析,打印最大长度和路径

LCS是什么

LCS是Longest Common Subsequence的缩写,即最长公共子序列。它与子串的区别是子串要连续,子序列不连续。

LCS可以用来做什么

1,生物学上用来进行基因序列比对,以推测序列的结构、功能和演化过程

2,用来描述两段文字的”相似性“,可以用来辨别是不是抄袭

怎么计算LCS

1,暴力穷举法

就是把两个序列所有的子序列都列出来,然后一一进行比较。

例如一个子序列有n个字符,每个字符按顺序放桌子上,动一下一个字符就会产生一个子序列,对于每个字符,存在拿走和不拿走两种情况,所以,一共有2的n次方个子序列,再和别个子序列比较,疯了。

2,动态规划法。

假如有字符串A和B, An表示A前n个字符组成的子串,Bm表示B前m个字符组成的子串。如果An=Bm,则LCS(An,Bm)=LCS(An-1,Bm-1)+An,这种计算方法一样,规模变小的方法一般叫动态规划。如果最后一个不一样,就砍掉A的最后一个和B比,或者砍掉B的最后一个和A比,取最大的,公式如下:


这么抽象,看看可视化二维数组吧



def lcs(a, b):# 参数是两个字符串a,b lena = len(a) lenb = len(b) # 用于存储Aj和Bi的最长公共子序列长度 opt = [[0 for i in range(lena + 1)] for j in range(lenb + 1)] # 用于存储转换规则,如果是跳转,即有字母一样了,存1,如果是上边的大于左边的存-1,否则保持0不变 flag = [[0 for i in range(lena + 1)] for j in range(lenb + 1)]

你可能感兴趣的:(LCS解析,打印最大长度和路径)