求符合条件的最大子串的长度

来源:互联网 发布:c 和java的三大框架 编辑:程序博客网 时间:2024/05/16 05:50

问题描述:

给出一些由英文字符组成的大小写敏 感的字符串的集合s,请找到一个最长的字符串x,使得对于s中任意字符串y,x或者是y的子串, 或者x中的字符反序之后得到的新字符串是y的子串。
输入:

输入的第一行是一个整数t (1 <= t <= 10), t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <= 100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1 和100之间的字符串。

输出:对于每一组测试数据,输出一行,给出 题目中要求的字符串x的长度。

思路:不要随便拿,要拿输入数据中最短的那个。从长到短找出它的所有子串,直到找到否符合题目要求的。

 

#include <iostream>#include <cstring>using namespace std;int searchMaxSubString(char *source);//几个全局变量int t;//字符集个数int n;//每个字符集所含字符串个数char str[100][101];int i;//循环变量//反转字符串(利用双指针)char *revstr(char *str){    char *left;    char *right;    left = right = str;    char tmpch;    while(*right)    {        right++;    }    //此时right指向字符串的'\0'    right--;    while(left < right)//这样可以保证正常退出循环    {        tmpch = *left;        *(left++) = *right;        *(right--) = tmpch;    }    return str;}int main(){    int minStrLen;    char minstr[101];    int subStrLen;    cin >> t;    while(t--)    {        cin >> n;        minStrLen = 100;//记录输入字符串中最短字符串的长度        for(i = 0; i < n; ++i)        {            cin >> str[i];//输入一组字符串            if(strlen(str[i]) < minStrLen)            {                strcpy(minstr, str[i]);                minStrLen = strlen(minstr);            }        }        subStrLen = searchMaxSubString(minstr);//最大字串的长度        cout << subStrLen << endl;    }    return 0;}int searchMaxSubString(char *source){   int sourceLen = strlen(source);   int subStrLen = strlen(source);   char subStr[101];   char reverseStr[101];   bool foundMaxStr;   while(subStrLen > 0)//搜索不同长度的子串,从最长的字串开始   {      /*搜索长度为subStrlen的全部字串,比如原串:abcdef(长度5)      长度5的子串1个,长度4的两个,长度3的3个...      原串与子串长度的差值(sourceLen - subStrLen)加1等于该长度的子串个数      */       for(int i = 0; i <= sourceLen - subStrLen; ++i)       {                                                         strncpy(subStr, source + i, subStrLen);           strncpy(reverseStr, source + i, subStrLen);           subStr[subStrLen] = reverseStr[subStrLen] = '\0';//这句很重要,保证subStr长度的字符串以此                                                            //长度结束           revstr(reverseStr);//反转字符串           foundMaxStr = true;           //遍历所有输入的字符串           for(int j = 0; j < n; ++j)           {                if(strstr(str[j], subStr) == NULL && strstr(str[j], reverseStr) == NULL)                {                    foundMaxStr = false;                    break;                }           }           if(foundMaxStr)           return subStrLen;       }       subStrLen--;   }}


 

原创粉丝点击