求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
- 求n个字符串的最大相同子串
- sdut 1008 最大公共子串(求n个字符串的最长公共子串)
- 求两字符串的最大相同子串--JAVA实现
- 求两个字符串的最大相同子串
- 求任意两个字符串的最大相同子串
- sdut 1008 最大公共子串(求n个字符串的最长公共子串)lcs
- 求两个字符串中的最大相同子串 SubString
- 用javascript求两个字符串最大的相同的子串
- 求两个字符串之间的最大相同的最大子字符串!!
- 求两个字符串的最大子串
- 求字符串的所有最大子串
- 求字符串的最大回文子串
- 华为上机题:求N个字符串的最长公共子串,字符串长度不超过255。
- 两个或N个字符串最大公共子串算法
- 两个或N个字符串最大公共子串算法
- 两个或N个字符串最大公共子串算法
- 两个或N个字符串最大公共子串算法
- 查找两个字符串的最大相同子串
- 并发、线程、进程与多线程技术
- Android URL中参数的获取、拼接及修改
- 在ubuntu上分别安装python和python3的tensorflow安装教程
- mybatis反向生成代码工具
- vb mid函数的使用方法详细介绍
- 求n个字符串的最大相同子串
- 从 HTTP 到 HTTPS 再到 HSTS
- $state.go跳转中 传递对象参数
- Leetcode Array 724 FindPivotIndex
- 一步一步带你认识MVP+Retrofit+Rxjava并封装(一)
- hdoj 2063 过山车
- 【Ubuntu】win7+Ubuntu16.04双系统安装与卸载
- opencsv4.0 自定义规则
- idea启动tomcat报错:Artifact mmall:war: Server is not connected. Deploy is not available