最长公共子序列的动态规划解法

最长公共子序列

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

猜你喜欢

转载自blog.csdn.net/playboygogogo/article/details/107990656
今日推荐