子串

问题描述
有一些由英文字符组成的大小写敏感的字符串。请写一个程序,找到一个最长的字符串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 <stdio.h>
# include <stdlib.h>
# include <string.h>
char str[100][101],n;
int searchMaxSubString(int min){//min(即为字符串长度最小的下标)
 /*
  strlen:计算字符串的长度
  strncpy:复制字符串的子串
  strcpy:复制字符串
  strstr:在字符串中寻找子字符串
  strrev:对字符串进行反序
 */
 
 char source[101],strMin[101],agStrMin[101];
 int i,j,sourceLen,strMinLen,findMin ;
 strcpy(source,str[min]);
 strcpy(strMin,str[min]);
 sourceLen = strlen(source);
 strMinLen = strlen(source);
 while(strMinLen > 0){
  for(i = 0;i <= (sourceLen - strMinLen);i++){
   findMin = 1;
   strncpy(strMin,source+i,strMinLen);
   strncpy(agStrMin,source+i,strMinLen);
   strMin[strMinLen] = '\0';
   agStrMin[strMinLen] ='\0';
   strrev(agStrMin);
   for(j = 0;j < n;j++){
    if(strstr(str[j],strMin) == NULL && strstr(str[j], agStrMin) == NULL){
     findMin = 0;
     break;
    }
   }
   if(findMin){
    return strMinLen;
   }
   
  }
  strMinLen--;
 }
 return 0;
}
int main()
{
 int t,i,minStr,subStrLen;
 char min;

 scanf("%d",&t);
 while(t--){
  scanf("%d",&n);
  minStr = 100;
  for(i = 0;i < n;i++){
   scanf("%s",str[i]);
   if(strlen(str[i]) < minStr)//在输入数据时候,就将字符最短的找出来,记录下最短字符串的下标(min)
   {
    minStr = strlen(str[i]);
    min = i;
   }
  }
  subStrLen = searchMaxSubString(min);//搜索满足条件的最长字符串
  printf("%d\n",subStrLen);
 }
 return 0;
}

/*

代码分析:本题最大的难点应该是子串的寻找与子串和字符串的对比。有题意很容易想到子串最好先在最短的字符串里寻找。

而要找的是满足题意的最长的子串,所以在最短字符串里寻找满足题意的最长子串时,应对最短字符串一一解剖,从最大-〉

最小。而这些的操作都用了头文件中已给的函数,但是代码的设计却决定了代码长度。刚开始我设计的非常的冗长,看了源

代码后,我发现源代码设计的非常巧妙,几乎每个变量都是不可去的。

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值