题意:给定n个字符串,求出最长的公共子字符串, 若有多种情况, 取字典序最小的.
解:
枚举出第一个字符串的所有子串,将每个子串都与其他n-1个字符串进行判断,是否为其他n-1个字符串的公共子串, ()
判断方法:
strstr(a,b) :若字符串b是字符串a的子串则返回b在a中首次出现的地址, 否则返回NULL (空);
调用此函数注意加上头文件 #include<string.h> 或写 #include<cstring>
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100;
char str[15][maxn];
int main()
{
int T, m, i,j,k;
scanf("%d", &T);
while(T--){
scanf("%d", &m);
for(i=1;i<=m; i++){
scanf("%s", str[i]);
}
int len = strlen(str[1]);
char ans[maxn];
memset(ans,'\0',sizeof(ans));
char sub[maxn];
for(i=0; i<len; i++){
for(j=i+2; j<len; j++){
memset(sub, '\0', sizeof(sub));
int len=0;
for(k=i; k<=j; k++){
sub[len++] = str[1][k];
}
bool flag=true;
for(k=2;k<=m;k++){
if(!strstr(str[k], sub)) {
flag=false;
break;
}
}
if(flag){
int len1=strlen(ans);
int len2=strlen(sub);
if(len1<len2){
strcpy(ans, sub);
} else if(len1==len2){
if(strcmp(ans, sub)>0){
strcpy(ans, sub);
}
}
}
}
}
if(strlen(ans)) printf("%s\n", ans);
else printf("no significant commonalities\n");
}
return 0;
}