目录:
题目:
输入两个字符串 s1,s2s1,s2。
输出最长连续公共子串长度和最长连续公共子串。
输入格式
一行,两个字符串 s1,s2s1,s2,用空格隔开。
输出格式
第一行输出最长连续公共子串的长度
第二行输出最长连续公共子串。如果不唯一,则输出最后一个。
数据范围
1≤|s1|,|s2|≤1001≤|s1|,|s2|≤100
输入样例:
abcdefg qwercdefiok
输出样例:
1. 4 2. 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; }