C字符串经典

POJ1226——Substrings

题意,给定一堆字符串,找出最大的公共子串。

//Date:     2015.04.25
//Time:     0ms
//Memory:   144k

#include <cstdio>
#include <cstring>
using namespace std;

const int MAX_LEN=105;
int n,index,length;
char str[100][MAX_LEN];

void rev(char source[]){	//strrev()在POJ上编译无法通过
    char c;
    int i,j=strlen(source)-1;
    for(i=0;i<j;i++){
        c=source[i];
        source[i]=source[j];
        source[j--]=c;
    }
}

int SubString(){
    bool found;
    int SubLen,i,j;
    char sub_string[MAX_LEN],rev_sub_string[MAX_LEN];
    for(SubLen=length;SubLen;SubLen--){
        for(i=0;i<=length-SubLen;i++){
            strncpy(sub_string,str[index]+i,SubLen);
            strncpy(rev_sub_string,str[index]+i,SubLen);
            sub_string[SubLen]=rev_sub_string[SubLen]='\0';
            rev(rev_sub_string);
            found=true;
            for(j=0;j<n;j++){
                if( (strstr(str[j],sub_string)==NULL) && (strstr(str[j],rev_sub_string)==NULL) ){
                    found=false;
                    break;
                }
            }
            if(found)
                return SubLen;
        }
    }
    return 0;
}

int main(){
    int t,i,temp;
    scanf("%d",&t);
    while(t--){
        length=105;
        scanf("%d",&n);
        getchar();
        for(i=0;i<n;i++){
            gets(str[i]);
            temp=strlen(str[i]);
            if(length>temp){
                length=temp;
                index=i;
            }
        }
        printf("%d\n",SubString());
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值