参考自:https://blog.csdn.net/wateryouyo/article/details/50917812
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。
def find_lcsubstr(s1, s2):
m=[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)] #生成0矩阵,为方便后续计算,比字符串长度多了一列
mmax=0 #最长匹配的长度
p=0 #最长匹配对应在s1中的最后一位
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i]==s2[j]:
m[i+1][j+1]=m[i][j]+1
if m[i+1][j+1]>mmax:
mmax=m[i+1][j+1]
p=i+1
return s1[p-mmax:p],mmax #返回最长子串及其长度
print find_lcsubstr('abcdfg','abdfg')
运行得到输出:(‘dfg’,3)
子串要求字符必须是连续的,但是子序列就不是这样。最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。
解法就是用动态回归的思想,一个矩阵记录两个字符串中匹配情况,若是匹配则为左上方的值加1,否则为左方和上方的最大值。一个矩阵记录转移方向,然后根据转移方向,回溯找到最长子序列。
import numpy
def find_lcseque(s1, s2):
# 生成字符串长度加1的0矩阵,m用来保存对应位置匹配的结果
m = [ [ 0 for x in range(len(s2)+1) ] for y in range(len(s1)+1) ]
# d用来记录转移方向
d = [ [ None for x in range(len(s2)+1) ] for y in range(len(s1)+1) ]
for p1 in range(len(s1)):
for p2 in range(len(s2)):
if s1[p1] == s2[p2]: #字符匹配成功,则该位置的值为左上方的值加1
m[p1+1][p2+1] = m[p1][p2]+1
d[p1+1][p2+1] = 'ok'
elif m[p1+1][p2] > m[p1][p2+1]: #左值大于上值,则该位置的值为左值,并标记回溯时的方向
m[p1+1][p2+1] = m[p1+1][p2]
d[p1+1][p2+1] = 'left'
else: #上值大于左值,则该位置的值为上值,并标记方向up
m[p1+1][p2+1] = m[p1][p2+1]
d[p1+1][p2+1] = 'up'
(p1, p2) = (len(s1), len(s2))
print numpy.array(d)
s = []
while m[p1][p2]: #不为None时
c = d[p1][p2]
if c == 'ok': #匹配成功,插入该字符,并向左上角找下一个
s.append(s1[p1-1])
p1-=1
p2-=1
if c =='left': #根据标记,向左找下一个
p2 -= 1
if c == 'up': #根据标记,向上找下一个
p1 -= 1
s.reverse()
return ''.join(s)
print find_lcseque('abdfg','abcdfg')
转载的一篇文章,因为最近想离职,所以看了下这篇文章,深有感触,想跟大家分享一下。希望作者能谅解,很感谢作者的文章点醒了我。原文地址是http://blog.csdn.NET/zhao_yin作为年轻人,我们苦心经营的无非两样——爱情和事业,拥有一份甜蜜的爱情能够为发展事业提供动力;而具有良好的事业更能为爱情提供保障,又或是成为追求爱情的资本。 我们渴望着自己心仪的事
今天为大家整理了32个Python爬虫项目。整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)OWechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。DouBanSpider [2]- 豆瓣读书爬虫。可以爬下豆瓣读书标签...
控制小程序允许页面收藏带来的影响微信小程序支持页面收藏、不支持隐藏收藏 有些页面不允许直接进入,(控制–页面被收藏后能直接被访问–带来的影响)方法一 配置黑名单当重新打开小程序页面路径在黑名单里时,页面跳回首页(从收藏进会重新打开小程序,不影响正常进入黑名单页面) onLaunch: function (e) { let path = e.path let list = [ "pages/login/index", "pages/index/index"
oracle学习笔记
IntelliJ IDEA设置main()方法等快捷键1、自带快捷键Idea中自带的main方法的快捷键是:psvmIdea中自带的sysout方法的快捷键是:sout2、设置方式1.首先在Settings配置界面找到Live Templates:2.建立Template Group模板分组:3...
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。
Gulp是基于Node.js的一个构建工具(自动任务运行器),开发者可以使用它构建自动化工作流程(前端集成开发环境)。一些常见、重复的任务,例如:网页自动刷新、CSS预处理、代码检测、压缩图片、等等…… 只需用简单的命令就能全部完成。使用它,可以简化工作,让你把重点放在功能开发上;同时减少人为失误,提高开发效率和项目质量,让专注更为专注。如果你之前接触过Grunt,那上手Gulp就会觉得非常容易理...
【IT168技术】使用Android中的Intents和自带的Gallery图库,用户可以从移动设备中选取喜欢的照片。在本教程中,我们将学习如何使用Gallery图库进行用户图片的自定义选择,并且会进行一些操作界面上的改进,以方便用户对图片进行选择。本文的阅读对象为有一定Android基础知识的读者。 下面进一步讲解本文程序要实现的功能。首先会使用Android内置的Gallery图库功能,
最近接了两个外包,另外还负责WI输入法http://wi.hit.edu.cn的手写开发和一个Bug的寻找,总结一些经验吧。一个购物车列表或其他的列表,可以用ListView来实现,当由『浏览状态』进入『编辑状态』的时候,可以这么干。『浏览状态』用一个xml文件,『编辑状态』用一个xml文件,这样实现会很简单。
相信大多人的项目中都会用到推送,极光友盟等,然而经常又被运营和测试问:为什么收不到推送???我的结论是这样的(以极光为例):一:app在运行中: 基本上是可以收到推送的。如果无法收到推送,可能有以下几种: 1、没有网络(一般可以忽略,用户、测试、运营都不是笨蛋); 2
1.关键字static的作用是什么?1.限制变量的作用域1) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。2.设置变量的存储域static修饰的变量和全局变量一样,都存储在静态存储...
我正在制作一个如下的散点图:(MWE在问题的底部)从上图中可以看出,图例中的点的颜色由matplotlib自动设置为蓝色.我需要将这些点设置为色彩中不存在的其他颜色(即:黑色),因此它们不会产生与所述色彩映射关联的颜色的混淆.我环顾四周,但是matplotlib.legend模块似乎没有接受颜色关键字.有没有办法做到这一点?这是MWE:import matplotlib.pyplot as plt...