hdu1238——Substrings——————【求多个字串的最长公共子串】

来源:互联网 发布:java老师王克晶年薪 编辑:程序博客网 时间:2024/05/22 15:02
/**    解题思路:因为给的数据范围比较小,所以就是暴力思想。首先找出最短的串,然后从短到长截取子串,遍历除最短串以外的其他串,看是否含有相同的子串。*//*题目大意:给t组测试数据,每组有一个n,代表有n个字符串,求n个字符串中含有的最长公共子串,此处,逆序也算是公共子串,如abc与cba。*//*处理string的函数。1)a.substr(i,j)将a串从i位置开始截取j个字符形成子串。2)a.compare(i,len,b,j,len)a串从i位置开始取len个字符与b串从j位置开始取len个字符进行比较,如果完全相同,返回0。3)reverse(a.begin(),a.end())将字串颠倒顺序。*/#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<string>using namespace std;const int maxn=110;string s[maxn];bool cmp(string a,string  b){    return a.size()<b.size();}bool search_same(string a,string b,int len){    //查找字符串b中是否含有子串a    int len_b=b.size();    for(int i=0;i<=len_b-len;i++){        if(!a.compare(0,len,b,i,len)){            return true;        }    }    reverse(a.begin(),a.end());    for(int i=0;i<=len_b-len;i++){        if(!a.compare(0,len,b,i,len)){            return true;        }    }    return false;}int main(){    int t;    scanf("%d",&t);    while(t--){        int n;        scanf("%d",&n);        for(int i=0;i<n;i++){            cin>>s[i];        }        sort(s,s+n,cmp);        int lmin_s=s[0].size();        int max_len=0;        for(int i=1;i<=lmin_s;i++){            //i代表截取子串的长度            int flag=0;//其他n-1个字符串中是否都含有公共子串            for(int j=0;!flag&&j<=lmin_s-i;j++){                //j代表枚举出的子串的串首位置                string tmp_s=s[0].substr(j,i);                int k;                for( k=1;k<n;k++){                    //遍历其他n-1个字符串                    if(!search_same(tmp_s,s[k],i)){                        break;                    }                }                if(k==n){                    //都含有公共子串                    flag=1;                }            }            if(flag==1){                max_len=i;            }else{break;}        }        cout<<max_len<<endl;    }    return 0;}
0 0
原创粉丝点击