BLUE Jeans

来源:互联网 发布:ude网络连接器 编辑:程序博客网 时间:2024/05/15 12:18

G - Blue Jeans

 
input 
32GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATAGATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAAGATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA3CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
output
no significant commonalitiesAGATACCATCATCAT

题意:在一堆串找出公共部分
思路:首先以第一个字符串为起点,对第一个字符串进行0-len-1的分割,找出公共部分
综合代码:
方法一:

#include<iostream>#include<string.h>#include<string>using namespace std;#define MAXN 60using namespace std;int main(){    int t;    cout<<"请输入测试次数"<<endl;    cin>>t; //测试数据的次数    while(t--)    {        int n; //每组测试数据有多少行数据        cout<<"请输入此数据的行数"<<endl;        cin>>n;        string str[10]; //用以存放数据        for(int i=0;i<n;i++)        {            cin>>str[i];        }        string res = " "; //用于存储找到的符合要求的子串        for(int i=3;i<=MAXN;i++) //i表示子串的长度        {            for(int j=0;j<MAXN;j++) //j表示字符串中的下标位置            {                string tmp=str[0].substr(j,i);                bool flag=true;                for(int k=1;k<n;k++)                {                    if(str[k].find(tmp)==string::npos)                    {                        flag=false;                        break;                    }                }                if(flag&&res.size()<tmp.size()) res=tmp;                      //获得较长的子串                else if(flag&&(res.size()==tmp.size())&&(tmp<res)) res=tmp;    //如果长度相等,则获得获得较小的字符串            }        }        if(res==" ") cout<<"no significant commonalities"<<endl;        else cout<<res<<endl;    }    return 0;}

方法二:

#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++)            {                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)                break;        }        if(strlen(ans)<3)            printf("no significant commonalities\n");        else            printf("%s\n",ans);    }        return 0;}