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)]