百炼OJ 2744 子串

来源:互联网 发布:韩版男士店铺淘宝 编辑:程序博客网 时间:2024/05/16 09:31

2744:子串

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

    解题报告:

    数据量很小直接暴力就可以过了,然后写了两种代码,一样的思路。

    代码1:

    #include <stdio.h>#include <string.h>char str[101][101];char substr[101];int findSubStr(int k){    int i, j, klen, cnt = 0, sublen;    klen = strlen(str[k]);    sublen = strlen(substr);    //正向    for (i = 0; i <= klen - sublen; i ++)    {        cnt = 0;        if (str[k][i] == substr[cnt])        {            cnt ++;            for (j = i + 1; j < klen; j ++)            {                if (str[k][j] != substr[cnt])                    break;                cnt ++;            }            if (cnt == sublen)                return 1;        }    }    //反向    for (i = klen - 1; i >= sublen - 1; i --)    {        cnt = 0;        if (str[k][i] == substr[cnt])        {            cnt ++;            for (j = i - 1; j >= 0; j --)            {                if (str[k][j] != substr[cnt])                    break;                cnt ++;            }            if (cnt == sublen)                return 1;        }    }    return 0;}int main(){    int n, i, j, k, slen, t;    scanf("%d", &t);    while (t --)    {        scanf("%d", &n);        for (i = 0; i < n; i ++)            scanf("%s", str[i]);        slen = strlen(str[0]);        int flag = 0;        while (i > 0)        {            for (i = slen - 1; i >= 0; i --)  //子串长度-1            {                for (j = 0; j < slen - i; j ++)   //子串起点                {                    strcpy(substr, str[0] + j);                    substr[i+1] = '\0';                    for (k = 1; k < n; k ++)                        if (!findSubStr(k))                            break;                    if (k == n)                    {                        printf("%d\n", strlen(substr));                        flag = 1;                        break;                    }                }                if(flag) break;            }            if(flag) break;        }        if(flag == 0) printf("0\n");    }    return 0;}

    代码2:

    #include <iostream>#include <string>#include <algorithm>using namespace std;string str[101];string sub;int main(){    int n, i, j, k, slen, t;    cin >> t;    while (t --)    {        cin >> n;        for (i = 0; i < n; i ++)            cin >> str[i];        slen = str[0].size();        int flag = 0;        while (i > 0)        {            for (i = slen - 1; i >= 0; i --)        //子串长度-1            {                for (j = 0; j < slen - i; j ++)   //子串起点                {                    sub = str[0].substr(j, i+1);                    for (k = 1; k < n; k ++)                        if (str[k].find(sub) == string::npos)                        {                            reverse(str[k].begin(), str[k].end());                            if(str[k].find(sub) == string::npos)                                break;                        }                    if (k == n)                    {                        cout << sub.size() << endl;;                        flag = 1;                        break;                    }                }                if(flag) break;            }            if(flag) break;        }        if(flag == 0) cout << "0\n";    }    return 0;}


    0 0