使用矩阵来记录两个子串之间各个字符之间的对应关系。

最长子串:矩阵中数字最大的就是最长子串的长度。若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1

  1. def longSubStr(str1,str2):
  2. len1 = len(str1)
  3. len2 = len(str2)
  4. longest,start1,start2 = 0,0,0
  5. c = [[0 for i in range(len2+1)]for i in range(len1+1)]
  6. for i in range(len1+1):
  7. for j in range(len2+1):
  8. if i == 0 or j == 0:
  9. c[i][j] = 0
  10. elif str1[i-1] == str2[j-1]:
  11. c[i][j] = c[i-1][j-1]+1
  12. else:
  13. c[i][j] = 0
  14. if (longest < c[i][j]):
  15. longest = c[i][j]
  16. start1 = i-longest
  17. start2 = j-longest
  18.  
  19. return str1[start1:start1+longest],start1,start2

最长子序列:若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1,若不同,则max(c[i][j-1],c[i-1][j]).

  1. def printLcs(flag,a,i,j):
  2. if i==0 or j==0:
  3. return
  4. if flag[i][j]=='OK':
  5. printLcs(flag,a,i-1,j-1)
  6. print a[i-1],
  7. elif flag[i][j]=='Left':
  8. printLcs(flag,a,i,j-1)
  9. else:
  10. printLcs(flag,a,i-1,j)
  11.  
  12. def longSubSeq(str1,str2):
  13. len1 = len(str1)
  14. len2 = len(str2)
  15. longest = 0
  16. c = [[0 for i in range(len2+1)]for i in range(len1+1)]
  17. flag = [[0 for i in range(len2+1)]for i in range(len1+1)]
  18. for i in range(len1+1):
  19. for j in range(len2+1):
  20. if i == 0 or j == 0:
  21. c[i][j] = 0
  22. elif str1[i-1] == str2[j-1]:
  23. c[i][j] = c[i-1][j-1]+1
  24. flag[i][j] = 'OK'
  25. longest = max(longest,c[i][j])
  26. elif c[i][j-1] > c[i-1][j]:
  27. c[i][j] =c[i][j-1]
  28. flag[i][j] = 'Left'
  29. else:
  30. c[i][j] =c[i-1][j]
  31. flag[i][j] = 'UP'
  32. printLcs(flag,str1,len1,len2)
  33. return longest
  34. a='ABCBDAB'
  35. b='BDCABA'
  36. print longSubSeq(a,b)

最长公共子串和子序列的Python实现,带图示。的更多相关文章

  1. 用Python计算最长公共子序列和最长公共子串

    如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...

  2. 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

  3. 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)

    目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...

  4. [Python]最长公共子序列 VS 最长公共子串[动态规划]

    前言 由于原微软开源的基于古老的perl语言的Rouge依赖环境实在难以搭建,遂跟着Rouge论文的描述自行实现. Rouge存在N.L.S.W.SU等几大子评估指标.在复现Rouge-L的函数时,便 ...

  5. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  6. 最长公共子序列PK最长公共子串

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...

  7. 动态规划(一)——最长公共子序列和最长公共子串

    注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...

  8. 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...

  9. DP:LCS(最长公共子串、最长公共子序列)

    1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...

随机推荐

  1. 【ActiveReports 大数据分析报告】用数据分析的手段告诉你,复联4有多火爆?

    消失的人们会回来吗,奇异博士所说的1400万分之一可能性究竟是什么,还会有谁逝去? 4月24日零时,随着万众期待的<复仇者联盟4>(以下简称<复联4>)正式上映,一切谜底都将揭 ...

  2. Nilearn 小记

    4.绘制脑图像 4.1 绘图功能 当打开了太多图像而不关闭时,会出现如下问题: 每次调用绘图函数都会创建一个新图像.当在非交互式设置(例如脚本或程序)中使用时,这些图像不会显示,但会常驻于内存中并最终 ...

  3. L1范数与L2范数​

    L1范数与L2范数​ ​ L1范数与L2范数在机器学习中,是常用的两个正则项,都可以防止过拟合的现象.L1范数的正则项优化参数具有稀疏特性,可用于特征选择:L2范数正则项优化的参数较小,具有较好的抗干 ...

  4. CSS scroll-behavior和JS scrollIntoView让页面滚动平滑

    转自 https://www.zhangxinxu.com/wordpress/2018/10/scroll-behavior-scrollintoview-%E5%B9%B3%E6%BB%91%E6 ...

  5. contenOs7编码问题

  6. cordova自定义插件的创建过程

    最近学习了cordova插件,记录一下大概的过程,仅供参考. 前期的配置就不记录了网上好多. 在简书上从新写了一个更详细的cordova插件教程,有需要的可以点这里进去看看. 第一步 创建一个cord ...

  7. Linux服务器,服务管理--systemctl命令详解,设置开机自启动

    Linux服务器,服务管理--systemctl命令详解,设置开机自启动 syetemclt就是service和chkconfig这两个命令的整合,在CentOS 7就开始被使用了. 摘要: syst ...

  8. python基础之虚拟环境--常用指令

    虚拟环境的介绍和应用就不在这里赘述了,做个快捷的记录 这是官方给出来的解释了https://docs.python.org/zh-cn/3.7/tutorial/venv.html 还看到有的人,还安 ...

  9. oralce问题

    死锁,如果较多使用存储过程杀死 create or replace procedure killer is    v_obj varchar2(200);    v_sql varchar2(500) ...

  10. Redis(二)--Jedis使用

    1.Jedis是连接java和redis的jar,这里用maven来添加jar包 # 在eclipse中新建maven project,填写GroupID.Artifactid # 在百度搜索mave ...