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:对字符串进行反序

 

posted on 2010-03-31 19:54  蓝牙  阅读(235)  评论(0编辑  收藏  举报