求n个字符串的最大相同子串

来源:互联网 发布:型材吹淘宝怎么搜 编辑:程序博客网 时间:2024/05/23 05:07

/****************************************************************
问题:
求n个字符串的最大相同子串
输入:行数n,接着输入n行字符串
输出:最大相同子字符串
解决思路:
首先获取n个字符串中长度最短的串的长度,然后先截取第0行字符串的子串,然后递归调用test求下一行的问题,
只有当前行与前一行字符串相同,才能进行下一行的比较,当能够比较到n行,则标志着最大子串已经找到
*****************************************************************/

#include<stdio.h>#include<string.h>#define MAXLine 20 //定义字符串最大行数 #define MAXLength 255 //定义最大字符串长度 char str[MAXLine][MAXLength]; //定义记录原始字符串的数组 char sub[MAXLine][MAXLength]; //定义记录当前字串的数组 int len[MAXLine];//定义记录字符串长度的数组 char maxsubstr[MAXLength];//用来记录n个串的最大相同子串 int flag=0;//标记是否找到最大相同子串,0表示未找到,1表示找到了 int n;//n用来记录实际的数据规模 void getsubstr(char *dest,char *src,int start,int end){//该函数用来截取src串中从指定位置开始到指定位置结束的字符串到dest数组中     int count=0;    for(int i=start;i<=end;i++){        dest[count++]=src[i];    }    dest[count]='\0';//注意字符串结束符 }/******************************************************************test函数用来解决当前行与上一行子串是否相同的问题 ,参数为当前行变量depth和当前子串的长度 maxlen , 递归的结束条件:层数(depth)到达字符串最大数目数。 此时的操作是复制最大子串到maxsubstr中,并将找到标记flag设置为1  递归关系:截取当前指定长度的子串与上一个指定长度的子串比较,如果相同,则进入下一行(即进行递归调用test)比较,当返回来时判断找到标记是否已经为1,为1就返回上一层。如果不相同,则从当前行子串的开始位置的下一个位置截取相同长度的子串。然后重复上述操作 ********************************************************************/ void test(int depth,int maxlen){    if(depth==n){        strcpy(maxsubstr,sub[0]);        flag=1;    }else{        for(int i=0;i<=len[depth]-maxlen;i++){            getsubstr(sub[depth],str[depth],i,i+maxlen-1);            if(!strcmp(sub[depth-1],sub[depth])){                test(depth+1,maxlen);                if(flag==1){                    return;                }            }        }    }}void getmaxstr(){    for(int i=0;i<n;i++){//求所有串的长度         len[i]=strlen(str[i]);    }    int minlen=len[0];    for(int i=1;i<n;i++){//求所有串长度的最小值,用minlen记录         if(len[i]<minlen){            minlen=len[i];        }    }    while(minlen){//while循环用来控制子串的长度         for(int i=0;i<=len[0]-minlen;i++){            getsubstr(sub[0],str[0],i,i+minlen-1); //截取子串             test(1,minlen);//进入下一行             if(flag==1){//判断是否已经结束                 break;            }           }        if(flag==1){//判读是否已经结束             break;        }        minlen--;    }}int main(){    scanf("%d",&n);    getchar();//消除输入回车符的影响     for(int i=0;i<n;i++){         gets(str[i]);//用gets是因为它是一次输入一行,解决了scanf以空格为结束符号的尴尬问题     }    getmaxstr();    printf("the max substr is:\n%s\n",maxsubstr);    return 0;}
阅读全文
0 0