最长公共子序列
1.定义
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。例:BDCABA;和ABCBDAB的最长公共子序列为BCBA,长度为4。
2.定义的延伸
最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置。而最长公共子串(要求连续)和最长公共子序列是不同的。
3.应用
最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。简而言之,百度知道、百度百科都用得上。
4.代码实现
最长公共子序列的动态规划解法:
(1)输入字符串str1,str2;定义足够大的二维数组list1.
(2)def maxSunstr(str1,str2):
(3) for i in range(len(str1)):
(4) for j in range(len(str2)):
(5) if str1[i] == str2[j]:
(6) list1[i+1][j+1] = list1[i][j] + 1
(7) else:
(8) list1[i+1][j+1] = max(list1[i][j+1], list1[i+1][j])
(9) n = min(len(str1), len(str2))
(10) return list1[n][n]
def maxSunstr(str1, str2):
list1 = [[0]*100]*100
for i in range(len(str1)):
for j in range(len(str2)):
if str1[i] == str2[j]:
list1[i+1][j+1] = list1[i][j] + 1
else:
list1[i+1][j+1] = max(list1[i][j+1], list1[i+1][j])
n = min(len(str1), len(str2))
return list1[n][n]
print(maxSunstr('dfecwzxc', 'abcdefwcqwe'))
运行结果:
C:\ProgramData\Anaconda3\python.exe "C:/pycharm/PyCharm Community Edition 2019.3.1/新职课/基础语法/每日练习/最长公共子序列.py"
4
Process finished with exit code 0