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

/**
    解题思路:因为给的数据范围比较小,所以就是暴力思想。首先找出最短的串,然后从短到长截取子串,遍历除最短串以外的其他串,看是否含有相同的子串。
*/
/*
题目大意:给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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值