当前位置:   article > 正文

最长公共子序列python实现

共同序列的python实现

        最长公共子序列是动态规划基本题目,以下依照动态规划基本步骤解出来。

1.找出最优解的性质,并刻划其结构特征

序列a共同拥有m个元素,序列b共同拥有n个元素,假设a[m-1]==b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是a[:m-1]和b[:n-1]的最长公共子序列长度+1;假设a[m-1]!=b[n-1],那么a[:m]和b[:n]的最长公共子序列长度就是MAX(a[:m-1]和b[:n]的最长公共子序列长度,a[:m]和b[:n-1]的最长公共子序列长度)。

2.递归定义最优值


3.以自底向上慷慨式计算出最优值

python代码例如以下:
  1. def lcs(a,b):
  2. lena=len(a)
  3. lenb=len(b)
  4. c=[[0 for i in range(lenb+1)] for j in range(lena+1)]
  5. flag=[[0 for i in range(lenb+1)] for j in range(lena+1)]
  6. for i in range(lena):
  7. for j in range(lenb):
  8. if a[i]==b[j]:
  9. c[i+1][j+1]=c[i][j]+1
  10. flag[i+1][j+1]='ok'
  11. elif c[i+1][j]>c[i][j+1]:
  12. c[i+1][j+1]=c[i+1][j]
  13. flag[i+1][j+1]='left'
  14. else:
  15. c[i+1][j+1]=c[i][j+1]
  16. flag[i+1][j+1]='up'
  17. return c,flag
  18. def printLcs(flag,a,i,j):
  19. if i==0 or j==0:
  20. return
  21. if flag[i][j]=='ok':
  22. printLcs(flag,a,i-1,j-1)
  23. print(a[i-1],end='')
  24. elif flag[i][j]=='left':
  25. printLcs(flag,a,i,j-1)
  26. else:
  27. printLcs(flag,a,i-1,j)
  28. a='ABCBDAB'
  29. b='BDCABA'
  30. c,flag=lcs(a,b)
  31. for i in c:
  32. print(i)
  33. print('')
  34. for j in flag:
  35. print(j)
  36. print('')
  37. printLcs(flag,a,len(a),len(b))
  38. print('')


执行结果输出例如以下:


4.依据计算最优值得到的信息,构造最优解

上图是执行结果,第一个矩阵是计算公共子序列长度的,能够看到最长是4;第二个矩阵是构造这个最优解用的;最后输出一个最优解BCBA。


转载于:https://www.cnblogs.com/zfyouxi/p/4195215.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/201901?site
推荐阅读
相关标签
  

闽ICP备14008679号