- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA 和ABCBDAB,字符串BCBA 和BDAB 都是是它们的最长公共子串,
则输出它们的长度4,并打印任意一个子串。
先介绍LCS 问题的性质:记Xm={x0, x1,…xm-1}和Yn={y0,y1,…,yn-1}为两个字符串,而Zk={z0,z1,…zk-1}是它们的LCS,则:1. 如果xm-1=yn-1,那么zk-1=xm-1=yn-1,并且Zk-1 是Xm-1 和Yn-1 的LCS;2. 如果xm-1≠yn-1,那么当zk-1≠xm-1 时Z 是Xm-1 和Y 的LCS;3. 如果xm-1≠yn-1,那么当zk-1≠yn-1 时Z 是Yn-1 和X 的LCS;
反推关系:
有了上面的性质, 我们可以得出如下的思路: 求两字符串Xm={x0, x1,…xm-1} 和Yn={y0,y1,…,yn-1}的LCS,如果xm-1=yn-1,那么只需求得Xm-1 和Yn-1 的LCS,并在其后添加xm-1(yn-1)即可;如果xm-1≠yn-1,我们分别求得Xm-1 和Y 的LCS 和Yn-1 和X的LCS,并且这两个LCS 中较长的一个为X 和Y 的LCS。
如果我们记字符串Xi 和Yj 的LCS 的长度为c[i,j],我们可以递归地求c[i,j]:
?? ?0 if i0 or j0
c[i,j]= ? ? ? ?c[i-1,j-1]+1 if i,j=0 and xi=xj
?? max(c[i,j-1],c[i-1,j] if i,j=0 and xi≠xj
上面的公式用递归函数不难求得。但从前面求Fibonacci 第n 项(本微软等100 题系列第19题)的分析中我们知道直接递归会有很多重复计算,我们用从底向上循环求解的思路效率更高。
为了能够采用循环求解的思路,我们用一个矩阵(参考代码中的LCS_length)保存下来当前已经计算好了的c[i,j],当后面的计算需要这些数据时就可以直接从矩阵读取。另外,求取c[i,j]可以从c[i-1,j-1] 、c[i,j-1]或者c[i-1,j]三个方向计算得到,相当于在矩阵LCS_length 中是从c[i-1,j-1],c[i,j-1]或者c[i-1,j]的某一个各自移动到c[i,j],因此在矩阵中有三种不同的移动方向:向左、向上和向左上方,其中只有向左上方移动时才表明找到LCS 中的一个字符。于是我们需要用另外一个矩阵(参考代码中的LCS_direction)保存移动的方向。
参考代码如下:#include string.h// directions of LCS generationenum decreaseDir {kInit = 0, kLeft, kUp, kLeftUp};/////////////////////////////////////////////////////////////////////////////// Get the length of two strings LCSs, and print one of the LCSs// Input: pStr1 - the first string// pStr2 - the second string// Output: the length of two strings LCSs/////////////////////////////////////////////////////////////////////////////int LCS(char* pStr1, char* pStr2){if(!pStr1 || !pStr2)return 0;size_t length1 = strlen(pStr1);size_t length2 = strlen(pStr2);if(!length1 || !length2)return 0;size_t i, j;
// initiate the length matrixint **LCS_length;LCS_length = (int**)(new int[length1]);for(i = 0; i length1; ++ i)LCS_length[i] = (int*)new int[length2];for(i = 0; i length1; ++ i)for(j = 0; j length2; ++ j)LCS_length[i][j] = 0;// initiate the direction matrixint **LCS_direction;
您可能关注的文档
- 科学发展史作业答案.doc
- 科学启蒙丛书——第一套美国小学科学教材的全译本.doc
- 科学教案:各种各样的路面.doc
- 科学研究与沟通考试4.doc
- 科学试验班(含文学、史学、哲学).doc
- 科技外语与文献检索-答案.doc
- 科技知识、人文知识、百科知识、生活知识竞赛题库及答案大全.doc
- 科技类知识问答答案.doc
- 科技英语阅读(李健版)翻译U3.doc
- 科教版一年级下册品德与生活教案[1].doc
- 2025年中国造纸机控制系统数据监测报告.docx
- 2025年中国锅炉销轴数据监测报告.docx
- 2025年国家电网中级职称考试(工业工程技术-营销工程)历年参考题库含答案详解.docx
- 2025年中国消防控制装置数据监测报告.docx
- 2025年冷成型型材模具项目可行性研究报告(市场数据调查、监测研究).docx
- 2025年中国家具衬脚垫数据监测研究报告.docx
- 2025年中国四色彩印手提袋数据监测研究报告.docx
- 2025年中国多功能情报面板数据监测研究报告.docx
- 2025年冗余式仪表电源项目可行性研究报告(市场数据调查、监测研究).docx
- 2025年中国小四柱立式塑胶射出成型机数据监测报告.docx
原创力文档


文档评论(0)