OpenJudge百炼-2744-子串-C语言-字符串处理

描述:
现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。
输入:
输入的第一行是一个整数t (1 <= t <= 10),t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <= 100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1和100之间的字符串。
输出:
对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。
样例输入:
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
样例输出:
2
2


/*****************************************************
**文件名:百炼-2744
**Copyright (c) 201-2025 OrdinaryCrazy
**创建人:OrdinaryCrazy
**日期:20170810
**描述:百炼2744参考答案
**版本:1.0
******************************************************/
#include 
#include 
/*****************************************************
作为整个字符串组的公共子串,最低要求它应该是最短的字符串的子串
则对最短字符串的子串由长到短依次检验,直到找到符合要求的长度为止
******************************************************/
char str[100][101];
int n,min,minl;
void strrevf(char* a)
{
    char* l = a;
    char* r = a;
    while(*r) r++;
    r --;
    char tmp;
    while(r > l)
    {
        tmp = *r;
        *r = *l;
        *l = tmp;
        r--;
        l++;
    }
}
/******************************************************
**函数名:solve
**输出:字符串组最长子串长度
**功能:计算字符串组最长子串长度
**作者:OrdinaryCrazy
**日期:20170810
**版本:1.0
*******************************************************/
int solve()
{
    int res = minl,i,j,found;
    char substr[101],revsubstr[101];
    while(res)
    {
        for(i = 0;i <= minl - res;i++)//对长为res的子串依次检验
        {
            strncpy(substr,&str[min][i],res);
            strcpy(revsubstr,substr);
            substr[res] = revsubstr[res] = '\0';
            strrevf(revsubstr);
            found = 1;
            for(j = 0;j < n;j++)
                if(strstr(str[j],substr)==NULL && strstr(str[j],revsubstr)==NULL)
                {
                    found = 0;
                    break;
                }
            if(found)
                return res;
        }
        res--;
    }
    return 0;
}
int main()
{
    int t,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        min = 0;
        minl = 1000;
        for(i = 0;i < n;i++)
        {
            scanf("%s",str[i]);
            if(strlen(str[i]) < minl)
            {
                min = i;
                minl = strlen(str[i]);
            }
        }
        printf("%d\n",solve());
    }
    return 0;
}

你可能感兴趣的:(C语言,OpenJudge)