- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE
PAGE 1
算法系列之六:最长公共子序列(LCS)问题(连续子序列)的三种解法
?
??????? 最长公共子序列(LCS)问题有两种方式定义子序列,一种是子序列不要求不连续,一种是子序列必须连续。上一章介绍了用两种算法解决子序列不要求连续的最终公共子序列问题,本章将介绍要求子序列必须是连续的情况下如何用算法解决最长公共子序列问题。
??????? 仍以上一章的两个字符串 “abcdea”和“aebcda”为例,如果子序列不要求连续,其最长公共子序列为“abcda”,如果子序列要求是连续,则其最长公共子序列应为“bcd”。在这种情况下,有可能两个字符串出现多个长度相同的公共子串,比如“askdfiryetd”和“trkdffirey”两个字符串就存在两个长度为3的公共子串,分别是“kdf”和“fir”,因此问题的性质发生了变化,需要找出两个字符串所有可能存在公共子串的情况,然后取最长的一个,如果有多个最长的公共子串,只取其中一个即可。
??????? 字符串 “abcdea”和“aebcda”如果都以最左端的a字符对齐,则能够匹配的最长公共子串就是“a”。但是如果用第二个字符串的e字符对齐第一个字符串的a字符,则能够匹配的最长公共子串就是“bcd”。可见,从两个字符串的不同位置开始对齐匹配,可以得到不同的结果,因此,本文采用的算法就是穷举两个字符串所有可能的对齐方式,对每种对齐方式进行字符的逐个匹配,找出最长的匹配子串。
?一、??? 递归方法?
??????? 首先看看递归方法。递归的方法比较简单,就是比较两个字符串的首字符是否相等,如果相等则将其添加到已知的公共子串结尾,然后对两个字符串去掉首字符后剩下的子串继续递归匹配。如果两个字符串的首字符不相等,则用三种对齐策略分别计算可能的最长公共子串,然后取最长的一个与当前已知的最长公共子串比较,如果比当前已知的最长公共子串长就用计算出的最长公共子串代替当前已知的最长公共子串。第一种策略是将第一个字符串的首字符删除,将剩下的子串与第二个字符串继续匹配;第二种策略是将第二个字符串的首字符删除,将剩下的子串与第一个字符串继续匹配;第三种策略是将两个字符串的首字符都删除,然后继续匹配两个字符串剩下的子串。删除首字符相当于字符对齐移位,整个算法实现如下:
?
180?void?RecursionLCS(const?std::string?str1,?const?std::string?str2,std::string?lcs)
181?{
182?????if(str1.length()?==?0?||?str2.length()?==?0)
183???? ????return;
184?
185?????if(str1[0]?==?str2[0])
186?????{
187???? ??? lcs?+=?str1[0];
188???? ??? RecursionLCS(str1.substr(1),?str2.substr(1),?lcs);
189?????}
190?????else
191?????{
192???? ??? std::string strTmp1,strTmp2,strTmp3;
193?
194???? ??? RecursionLCS(str1.substr(1),?str2,?strTmp1);
195???? ??? RecursionLCS(str1,?str2.substr(1),?strTmp2);
196???? ??? RecursionLCS(str1.substr(1),?str2.substr(1),?strTmp3);
197???? ??? std::string strLongest?=?GetLongestString(strTmp1,?strTmp2,?strTmp3);
198???? ????if(lcs.length()??strLongest.length())
199???? ??? ??? lcs?=?strLongest;
200?????}
201?}
?二、??? 两重循环方法
??????? 使用两重循环进行字符串的对齐匹配过程如下图所示:
图(1)两重循环字符串对齐匹配示意图
?
第一重循环确定第一个字符串的对齐位置,第二重循环确定第二个字符串的对齐位置,每次循环确定一组两个字符串的对齐位置,并从此对齐位置开始匹配两个字符串的最长子串,如果匹配到的最长子串比已知的(由前面的匹配过程找到的)最长子串长,则更新已知最长子串的内容。两重循环的实现算法如下:
?
153?void?LoopLCS(const?std::string?str1,?const?std::string?str
您可能关注的文档
- 银行招聘考试.docx
- 以项目社工为依托的社区服务中心“嵌入式”运营研究——以深圳市 W 社区服务中心为例.docx
- 乡镇关于开展严肃乡镇换届纪律工作的汇报.docx
- 先秦君子风范(课后练习及考试答案).docx
- 我国城市交通拥堵的对策研究——以济南市为例.docx
- 数据库课程设计--毕业设计信息管理系统.docx
- 全国大学生电子设计大赛F题一等奖--数字频率计.docx
- 曲根10000词汇电子讲义.docx
- 浅析监理人员素质对监理工作的影响.docx
- 汽车雨量传感器设计与自动雨刮控制系统.docx
- 2025年江西机电职业技术学院单招语文测试题库最新.docx
- 2025年江苏航空职业技术学院单招语文测试模拟题库最新.docx
- 2025年秦皇岛工业职业技术学院单招语文测试模拟题库最新.docx
- 2025年西安高新科技职业学院单招(语文)测试题库附答案.docx
- 2025年哈尔滨职业技术学院单招语文测试题库最新.docx
- 2025年河南测绘职业学院单招语文测试模拟题库附答案.docx
- 2025年南阳科技职业学院单招语文测试模拟题库最新.docx
- 2025年西南财经大学天府学院单招(语文)测试题库附答案.docx
- 2025年潍坊理工学院单招语文测试模拟题库附答案.docx
- 2025年四川建筑职业技术学院单招(语文)测试题库最新.docx
最近下载
- 2022山东能源集团中级人才库选拔上岸笔试历年难、易错点考题附带参考答案与详解.docx
- 统编版(2024)新教材七年级道德与法治下册第一单元《珍惜青春时光》每课时探究训练(含答案)汇编(含六套题).docx VIP
- 最新部编版四年级语文下册第八单元习作《故事新编》精品课件PPT.ppt VIP
- 食品安全自查、从业人员健康管理、进货查验记录、食品.docx VIP
- 大模型推理加速的优化实践-2024全球机器学习技术大会.pdf
- GB50858-2013 园林绿化工程工程量计算规范.docx
- 三亚太阳湾柏悦酒店宴会服务研究.docx
- 钢结构工程计量与计价培训资料.pptx VIP
- 中国普通流通纪念币完整目录(127枚)(1984年-2023年).pdf VIP
- 2025年科级领导干部任前廉政法规知识考试题(附答案).pdf VIP
文档评论(0)