链接:点击打开链接
(1)函数原型:extern char *strstr(char *str1, char *str2); 功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。判断一个子串是否在一个字符串中出现
(2)原型:char *strcpy(char *dest, char *src); 功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。
( 3) 原型:char * strncpy(char *dest, char *src, size_t n); 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样只有遇到NULL才停止复制,而是多了一个条件停止,就是说如果复制到第n个字符还未遇到NULL,也一样停止),返回指向dest的指针。
(4) strlen(char *str) 计算c风格字符串的长度。
(5)题意解析:
a) 这里首先从所有的字符串中找出最短的那个字符串作为源字符串。
b) 然后按照从长到短的枚举方法一个一个的查找是否其他的字符串是否均含有该源字符串的子字符串。这里借助于库函数strstr
c) 遍历方法,首先是整个源字符串,然后是源字符串长度减少1的所有字符串,然后是减少2的所有字符串,如果找到就跳出来输出。
(6)另外注意的是这里还要求了也可以是某个字符串的翻转字符串也可以。
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char str1[105][105],str2[105],pos1[105],pos2[105];
int i,j,t,n,min_len,id,flag;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
min_len=105;
for(i=0;i<n;i++){
scanf("%s",str1[i]);
if(strlen(str1[i])<min_len){
min_len=strlen(str1[i]);
id=i;
}
}
int len;
len=min_len;
strcpy(str2,str1[id]);
while(len>0){
// flag=0;
for(i=0;i<=min_len-len;i++){
flag=1;
strncpy(pos1,str2+i,len);
for(j=0;j<len;j++)
pos2[j]=pos1[len-j-1];
pos1[len]=pos2[len]='\0';
for(j=0;j<n;j++){
if(strstr(str1[j],pos1)==NULL&&strstr(str1[j],pos2)==NULL){
flag=0;
break;
}
}
if(flag) break;
}
if(flag) break;
len--;
}
printf("%d\n",len);
}
return 0;
}