// 17蓝桥省赛_CPP/B No.6————最大公共子串
#include <cstdio>
#include <cstring>
const int N=256;
int f(const char* s1, const char* s2){
//int f(const char s1[], const char s2[]){ //等效
int a[N][N]; //a[i][j]与前面的LCS一样都表示:串s1的第i号位之前和串s2的第j号位之前的最大公共子串的长度
int len1 = strlen(s1);
int len2 = strlen(s2);
int i,j;
memset(a,0,sizeof(int)*N*N); //即 边界:a[0][j] = a[i][0] = 0;
int max = 0;
for(i=1;i<=len1;i++){
for(j=1;j<=len2;j++){
if(s1[i-1]==s2[j-1]){
a[i][j]=a[i-1][j-1]+1; //状态转移方程,最大公共子串的长度+1
if(a[i][j]>max) max=a[i][j];
}
//没有else,当不相等的话串就断了(a[i][j]值为0),区分题目是“串(本题)”还是“序列(最长公共子序列LCS)”
}
}
return max;
}
int main(){
printf("%d\n", f("abcdkkka", "baabcdadabc")); //答案4
return 0;
}
最大公共子[串]——17蓝桥省赛T6
最新推荐文章于 2024-06-08 13:00:38 发布