文章
2
粉丝
399
获赞
0
访问
17.0k
//最长公共子序列,和求公共字符串有点像
#include<cstdio>
#include<iostream>
using namespace std;
int dp[100][100];//dp[i][j]? i表示str1中第i个字符,j表示str2中第j个字符
int main(){
string str1,str2;
while(cin>>str1>>str2){//输入str1,str2
//初始化动态数组,即str1与str2中的每一个字符都不相同??
for(int i=0;i<str1.size();++i){
for(int j=0;j<str2.size();++j){
dp[i][j]=0;
}}
string answer;//用来记录最长连续公共字符串
int max1=0;//用来记录公共子串最大长度
//关键内容
for(int i=0;i<str1.size();++i){
for(int j=0;j<str2.size();++j){
if(i==0||j==0){//第一个字符he另一个字符串中的任意位置相同时,他们两的公共子串最大只能是1
if(str1[i]==str2[j]){
dp[i][j]=1;
}//if
}//if
else{//处理不是第一个字符的情况
if(str1[i]==str2[j]){//两个字符串的字符相同,等于各自位置的上一个字符的公共子串长度相加
dp[i][j]=dp[i-1][j-1]+1;
}else{//不相同时,标为0表示无相同
dp[i][j]=0;
}
if(dp[i][j]>=max1){//因为要取最后的公共字符串,所以要=
max1=dp[i][j];
answer=str1.substr(i-max1+1,max1);
}//if
}//else
}//for j
}//for i
cout<<max1<<endl;
cout<<answer<<endl;
}...
登录后发布评论
暂无评论,来抢沙发