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

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

 def longSubStr(str1,str2):
len1 = len(str1)
len2 = len(str2)
longest,start1,start2 = 0,0,0
c = [[0 for i in range(len2+1)]for i in range(len1+1)]
for i in range(len1+1):
for j in range(len2+1):
if i == 0 or j == 0:
c[i][j] = 0
elif str1[i-1] == str2[j-1]:
c[i][j] = c[i-1][j-1]+1
else:
c[i][j] = 0
if (longest < c[i][j]):
longest = c[i][j]
start1 = i-longest
start2 = j-longest 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]).

 def printLcs(flag,a,i,j):
if i==0 or j==0:
return
if flag[i][j]=='OK':
printLcs(flag,a,i-1,j-1)
print a[i-1],
elif flag[i][j]=='Left':
printLcs(flag,a,i,j-1)
else:
printLcs(flag,a,i-1,j) def longSubSeq(str1,str2):
len1 = len(str1)
len2 = len(str2)
longest = 0
c = [[0 for i in range(len2+1)]for i in range(len1+1)]
flag = [[0 for i in range(len2+1)]for i in range(len1+1)]
for i in range(len1+1):
for j in range(len2+1):
if i == 0 or j == 0:
c[i][j] = 0
elif str1[i-1] == str2[j-1]:
c[i][j] = c[i-1][j-1]+1
flag[i][j] = 'OK'
longest = max(longest,c[i][j])
elif c[i][j-1] > c[i-1][j]:
c[i][j] =c[i][j-1]
flag[i][j] = 'Left'
else:
c[i][j] =c[i-1][j]
flag[i][j] = 'UP'
printLcs(flag,str1,len1,len2)
return longest
a='ABCBDAB'
b='BDCABA'
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. 《一些神奇的JS功效》

    1: async 异步回调 (ES6) async function test(){ console.log("hello wolrd"); } test().then(funct ...

  2. 0x11栈之Editor

    参考链接:https://blog.csdn.net/SSLGZ_yyc/article/details/81700623 对顶栈的思想: 建立两个栈,栈A存储从序列开头到当前光标的位置的一段序列,栈 ...

  3. sed命令替换文件的内容【学习笔记】

    sed -i "s/line/Line/g" `grep "line" -rl /home//zhuangzebin/`

  4. python - Random常用方法记录

    import random # range [a,b) 不包含b # 获取随机整数 # randrange [a,b) 不包含b a = random.randrange(0, 101, 5) # E ...

  5. 将webcam设置为网站favicon

    今天在Twitter上看到用户davywtf将webcam设置为网站favicon. 在线示例: https://wybiral.github.io/code-art/projects/tiny-mi ...

  6. VBoxManage安装

    扩展包的版本需要与VirtualBox的版本一致,通过帮助可以查看VirtualBox的版本信息,然后在http://download.virtualbox.org/virtualbox/寻找对应的版 ...

  7. sublime 部分插件

    https://www.cnblogs.com/qingkong/p/5039527.html

  8. Git复习步骤

    1.首先肯定是安装与配置了 首先要下载Git,然后设置用户名/邮箱 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...

  9. Python Django Web开发的5个优秀好习惯

    https://blog.csdn.net/weixin_42134789/article/details/82381854

  10. spring history

    Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦 ...