目录:
题目:
输入两个字符串 s1,s2s1,s2。
输出最长连续公共子串长度和最长连续公共子串。
输入格式
一行,两个字符串 s1,s2s1,s2,用空格隔开。
输出格式
第一行输出最长连续公共子串的长度
第二行输出最长连续公共子串。如果不唯一,则输出最后一个。
数据范围
1≤|s1|,|s2|≤1001≤|s1|,|s2|≤100
输入样例:
abcdefg qwercdefiok
输出样例:
4
cdef
思路:
动态规划,不断更新最长连续公共子串,并记录末端位置。
核心代码:
if(x[i-1]==y[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;//在上一对应相同的后面加1
if(dp[i][j]>=sum)//更新长度
{
sum=dp[i][j];
end=i-1;//记录公共子串末端位置
}
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
int main()
{
string x,y;
cin>>x>>y;
int sum=0,end=0;
int n=x.size();
int nn=y.size();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=nn;j++)
{
if(x[i-1]==y[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>=sum)
{
sum=dp[i][j];
end=i-1;
}
}
}
}
cout<<sum<<endl;
for(int i=end-sum+1;i<=end;i++)
cout<<x[i];
cout<<endl;
return 0;
}