4.4 例题: 子串
问题描述
有一些由英文字符组成的大小写敏感的字符串。请写一个程序,找到一个最长的字符串x,使得:对于已经给出的字符串中的任意一个y,x 或者是y 的子串、或者x 中的字符反序之后得到的新字符串是y 的子串。
输入:输入的第一行是一个整数t (1 <= t <= 10),t 表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <= 100) ,表示已经给出n 个字符串。接下来n 行,每行给出一个长度在1 和100 之间的字符串。
输出:对于每一组测试数据,输出一行,给出题目中要求的字符串x 的长度;如果找不到符合要求的字符串,则输出0。
输入样例
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
输出样例
2
2
解答:
#include <cstdio>
#include <string>
int t,n;
char str[100][101];
int searchMaxSubString(char* source)
{
int subStrLen=strlen(source),sourceStrLen=strlen(source);
int i,j;
bool foundMaxSubStr;
char subStr[101],revsubStr[101];
while(subStrLen>0)// 搜索不同长度的子串,从最长的子串开始搜索
{
for(i=0;i<=sourceStrLen-subStrLen;i++)
{// 搜索长度为subStrLen 的全部子串
strncpy(subStr,source+i,subStrLen);
strncpy(revsubStr,source+i,subStrLen);
subStr[subStrLen]=revsubStr[subStrLen]='\0';
strrev(revsubStr);
foundMaxSubStr=true;
for(j=0;j<n;j++)
if(strstr(str[j],subStr)==NULL && strstr(str[j],revsubStr)==NULL)
{
foundMaxSubStr=false;
break;
}
if(foundMaxSubStr) return subStrLen;
}
subStrLen--;
}
return 0;
}
int main()
{
int i,minStrLen,subStrLen;
char minStr[101];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
minStrLen=100;
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
if(strlen(str[i])<minStrLen)//如果字符串长度小于定义的minStrLen,则把它存到这个数组里
{
strcpy(minStr,str[i]);
minStrLen=strlen(minStr); //并重新计算它的长度
}
}
subStrLen=searchMaxSubString(minStr);//调用子函数
printf("%d\n",subStrLen);
}
system("pause");
return 0;
}
注:
strlen:计算字符串的长度
strncpy:复制字符串的子串
strcpy:复制字符串
strstr:在字符串中寻找子字符串
strrev:对字符串进行反序