公共字串计算(最长公共子串/序列)C++

描述

题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写

输入

输入两个字符串

输出

输出一个整数

样例输入

asdfas werasdfaswer

样例输出

6

思路

暴力求解
此题用cin即可

代码

#include <iostream>
#include <string>
using namespace std;
int Maxsubstr(string a,string b)
{unsigned int start1,start2;int count=0,Max=0;for(unsigned int i=0; a[i]!='\0'; i++){for(unsigned int j=0; b[j]!='\0'; j++){start1=i;start2=j;while(a[start1]==b[start2] && start1<a.length() && start2<b.length()){start1++;start2++;count++;}if(count>Max){Max=count;}count=0;}}return Max;
}int main()
{string str1,str2;cin>>str1;cin>>str2;//不区分大小写for (unsigned int i=0; i<str1.length(); i++){str1[i]=tolower(str1[i]);}for (unsigned int i=0; i<str2.length(); i++){str2[i]=tolower(str2[i]);}cout<<Maxsubstr(str1,str2)<<endl;
}

题目

描述

查找两个字符串a,b中的最长公共子串。
详细描述:
查找两个字符串a,b中的最长公共子串。

输入

输入两个字符串

输出

返回重复出现的字符

样例输入

abcdefghijklmnop
abcsafjklmnopqrstuvw

样例输出

jklmnop

思路

暴力求解

代码

#include <iostream>
#include <string>
using namespace std;
int Maxsubstr(string a,string b,string *&s)
{unsigned int start,start1,start2;int count=0,Max=0;for(unsigned int i=0; a[i]!='\0'; i++){for(unsigned int j=0; b[j]!='\0'; j++){start1=i;start2=j;while(a[start1]==b[start2] && start1<a.length() && start2<b.length()){start1++;start2++;count++;}if(count>Max){start = i;Max = count;}count=0;}}//保存字符串s=new string[Max+1];for(int i=0; i<Max; i++){s[i]=a[i+start];}s[Max]='\0';return Max;
}int main()
{string str1,str2,*str;    cin>>str1>>str2;//此题输入-------------//getline(cin,str1);//getline(cin,str2);int length = Maxsubstr(str1,str2,str);for(int i=0; i<length; i++){cout<<str[i];}cout<<endl;return 0;
}

如果你看到这里觉得暴力方法low

Low。。。。

哎,那就聊聊动态规划版的经典问题《最长公共子串(序列)》

子串是连续的,子序列可以是不连续的。

状态转移方程:

符号约定,C1是S1的最右侧字符,C2是S2的最右侧字符,S1‘是从S1中去除C1的部分,S2’是从S2中去除C2的部分。

LCS(S1,S2)等于下列3项的最大者:

(1)LCS(S1,S2′′)

(2)LCS(S1′′,S2)

(3)LCS(S1′′)+C1 —如果C1等于C2;

边界终止条件:如果S1和S2都是空串,则结果也是空串。

下面我们同样要构建一个矩阵来存储动态规划过程中子问题的解。这个矩阵中的每个数字代表了该行和该列之前的LCS的长度。与上面刚刚分析出的状态转移议程相对应,矩阵中每个格子里的数字应该这么填,它等于以下3项的最大值:

(1)上面一个格子里的数字

(2)左边一个格子里的数字

(3)左上角那个格子里的数字(如果 C1不等于C2); 左上角那个格子里的数字+1( 如果C1等于C2)

#include<iostream>
#include<cstring>
#include <vector>using namespace std;void SubSequence(vector<vector<string>> &flag,string str1, string str2,int i,int j);
void display(int *result,string str1,string str2);void initialVector(vector<vector<string>> &vectorAll,int len)
{for(int i=0; i<len; ++i){vector<string> temp;vectorAll.push_back(temp);}
}int lcs_string(string str1, string str2)
{int len1 = str1.length();int len2 = str2.length();int result = 0;     //记录最长公共子串长度int c[len1+1][len2+1] ;int endPos = -1;for (int i = 0; i <= len1; i++){for( int j = 0; j <= len2; j++){if(i == 0 || j == 0){c[i][j] = 0;}else if (str1.at(i-1) == str2.at(j-1)){c[i][j] = c[i-1][j-1] + 1;result = max(c[i][j], result);if(result==c[i][j])  endPos = i;//记录最后一个点的位置}else{c[i][j] = 0;//重新计数}}}//print resultstring str="";if(endPos<=len1){str = str1.substr(endPos-result,result);}else{str = str2.substr(endPos-result,result);}cout<<"\n\nLongest Common Substring : "<<str<<endl;return result;
}
//对于最长公共子序列,只是在最后一个else里面放的是前两步的最大值
int lcs_squence(string str1, string str2)
{int len1 = str1.length();int len2 = str2.length();int c[len1+1][len2+1];vector<vector<string>> flag;initialVector(flag,len1+1);for (int i = 0; i <= len1; i++){for( int j = 0; j <= len2; j++){if(i == 0 || j == 0){c[i][j] = 0;flag[i].push_back("NULL");}else if (str1.at(i-1) == str2.at(j-1)){c[i][j] = c[i-1][j-1] + 1;flag[i].push_back("left_up");}else if(c[i - 1][j]>=c[i][j - 1]){c[i][j]=c[i - 1][j];flag[i].push_back("left");}else{c[i][j] = c[i][j - 1];flag[i].push_back("up") ;}}}//display(&c[0][0],str1,str2);  //输出数组SubSequence(flag,str1,str2,str1.length(),str2.length());//cout<<c[len1][len2]<<endl;return c[len1][len2];
}void display(int *result,string str1,string str2)
{int len1 = str1.length();int len2 = str2.length();//输出表头for(int i=0; i<=len2; ++i){cout<<"\t"<<str2[i];}cout<<endl;//输出数组for(int i=0; i<=len1; ++i){cout<<str1[i]<<"\t";for(int j=0; j<=len2; ++j){cout<<*result<<"\t";result++;}cout<<endl;}}
//按照方向查找
void SubSequence(vector<vector<string>> &flag,string str1, string str2,int i,int j)
{if (i == 0 || j == 0)return;if (flag.at(i).at(j) == "left_up"){cout<<str2[j - 1]<<" ("<< i - 1<<" , "<< j - 1<<")"<<endl;//左前方SubSequence(flag,str1,str2,i - 1, j - 1);}else{if (flag.at(i).at(j) == "up"){SubSequence(flag,str1,str2,i, j - 1);}else{SubSequence(flag,str1,str2,i - 1, j);}}
}int main()
{string X = "";string Y = "";//输入getline(cin,X);getline(cin,Y);cout<<"\nFirst string:\n"<<X<<endl;cout<<"\nSecond string:\n"<<Y<<endl;cout << "Length of Longest Common Substring is " << lcs_string(X, Y)<<endl;cout << "Length of Longest Common Subsequence is " << lcs_squence(X, Y)<<endl;return 0;
}

参考引用

传送门 : 最长公共子序列

传送门 : 最长公共子序列(LCS)C++实现

传送门 : 最长公共子序列与最长公共子串

传送门 : 最长公共子序列。。

传送门 : 最长公共子序列。。大杂烩

最长公共子串计算C++相关推荐

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

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

  2. 求最长公共子序列python_用Python计算最长公共子序列和最长公共子串

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

  3. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  4. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  5. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  6. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  7. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  8. 程序员面试题精选100题(20)-最长公共子串[算法]

    题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串.注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中.请编写一个函数,输入两个字符串, ...

  9. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  10. 动态规划—最长公共子串

    1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...

最新文章

  1. 收集到的一些网络工程师面试题 和大家分享下
  2. Python设计模式面向对象编程
  3. evoc服务器长鸣报警显示正常,UPS电源故障灯亮,蜂鸣器长鸣报警怎么办
  4. 模拟信号与离散信号之间的频率关系(由模拟信号采样得到的离散信号)
  5. Oracle10gr2 开机自启动脚本
  6. linux安全服务管理,Linux系统安全管理服务配置方法与技巧
  7. CRMEB 小程序版源码下载
  8. linux nodejs 采集器,Linux记录-jstack采集namenode gc信息
  9. linux udhcpc指令,dhcpclient和udhcpc区别和用法
  10. WCF必知必会以及与Webapi的区别
  11. python单片机编程软件下载_Python开发例程大全
  12. php xingnengfenxi_PHP 性能分析第三篇: 性能调优实战
  13. Linux系统如何配置64个IP,Linux系统配置IP
  14. 【英语语法入门】 第21讲 将来时
  15. 乡村黄昏[原创诗一首]
  16. Android权限请求弹窗自定义,安卓权限申请处理框架Android-UsesPermission
  17. CSS 实现水晶按钮特效 - 来自 www.codesc.net
  18. c语言中while(a)、if(a)、while(!a)、if(!a)、if(%a)是什么意思?
  19. 计算机移动硬盘的一般作用,移动硬盘有什么用处
  20. 我们公司财务不接受电子发票纸质打印报销,这合理吗?

热门文章

  1. 。。。。看毛片算法_(:з」∠)_ /FZU - 2275
  2. vs2005 无法启动调试 绑定句柄无效的解决
  3. XMLSpy使用流程
  4. 高德 设置marker zoom_ZOOM云会议下载安装-ZOOM云视频会议最新版v5.3.53292
  5. 万能免费信息采集软件-免费网站信息内容数据采集软件
  6. abaqus的python安装文件在哪_Abaqus2016安装教程【附软件下载地址】
  7. 服务器部署Nodejs api 接口
  8. 实用的数据可视化工具大集合
  9. C语言运算符的优先级与结合性
  10. 计算机辅助园林设计ps,《CAD PS辅助园林设计》课程教学大纲.doc