/** 解题思路:因为给的数据范围比较小,所以就是暴力思想。首先找出最短的串,然后从短到长截取子串,遍历除最短串以外的其他串,看是否含有相同的子串。 */ /* 题目大意:给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; }
hdu1238——Substrings——————【求多个字串的最长公共子串】
最新推荐文章于 2019-10-31 23:24:41 发布