文章

2

粉丝

399

获赞

0

访问

17.0k

头像
自己的看法,做了好久
P1730 西安电子科技大学2018年机试题
发布于2021年3月6日 11:58
阅读数 8.8k

//最长公共子序列,和求公共字符串有点像

#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;

}...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发