poj3080——Blue Jeans

来源:互联网 发布:淘宝设计感饰品 知乎 编辑:程序博客网 时间:2024/06/05 23:55

题目大意:给出多个ATCG组成的字符串,写个程序找出他们的最长公共连续子串

输入:case个数n

           第i个case的字符串个数m (2 <= m <= 10) 

           第i个case的第k个字符串(长度为60)

输出:若最长公共连续子串长度小于3则输出no significant commonalities

           否则输出该子串(若有多个最长,则按字母序输出第一个)

分析:这道题可以用暴力或者KMP(改进的字符串匹配算法)。

           暴力:暴力枚举第一个字符串的所有子串,看看是否存在于其他字符串中

代码:kmp参考https://www.cnblogs.com/yjiyjige/p/3263858.html

暴力枚举:转载自http://blog.csdn.net/libin56842/article/details/17204373

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

char str[15][65];
char sub[65];
char ans[65];
int len;

int main()
{
    int t,i,j,k,n,maxn;
    scanf("%d",&t);
    while(t--)
    {
        maxn = 0;
        scanf("%d",&n);
        memset(ans,'\0',sizeof(ans));
        for(i = 1; i<=n; i++)
            scanf("%s",str[i]);
        for(i = 1; i<=60; i++)//从第一个字符串中取出的子串长度
        {
            int find = 0;//判断这个长度的子串是否出现在所有子串中
            for(j = 0; j<=60-i; j++)//长度为i的子串的开始指针
            {
                len = 0;
                int check = 1;
                for(k = j;;k++)
                {
                    sub[len++] = str[1][k];
                    if(len == i)
                        break;
                }
                sub[len] = '\0';
                for(k = 2; k<=n; k++)
                {
                    if(!strstr(str[k],sub))
                    {
                        check = 0;
                        break;
                    }
                }
                if(check)
                {
                    find = 1;
                    if(strlen(ans)<strlen(sub))
                    strcpy(ans,sub);
                    else if(strcmp(ans,sub)>0)//按字典序最小输出
                    strcpy(ans,sub);
                }
            }
            if(!find)//如果这个长度的所有子串搜索结束find还为0,则跳出循环,证明已经达到最大长度
            break;
        }
        if(strlen(ans)<3)
            printf("no significant commonalities\n");
        else
            printf("%s\n",ans);
    }


    return 0;
}