黑马程序员技术交流社区
标题: 找出多个字符串中的最大公共子字符串,如“nbitheimanb... [打印本页]
作者: mocha 时间: 2016-4-11 21:53
标题: 找出多个字符串中的最大公共子字符串,如“nbitheimanb...
这题从main函数里第三个for循环开始就看不太懂了,本人理解应该是对比字符串的时候第一个字符串的长度。大概是说第一个字符串和第二个对比找出最大的公共子字符串,找到了第一个字符串再与第三个对比,如果不是第一次对比的字符串就再全部重新对比。
希望高手们略微指点下这题的思路,能写点注释感激不尽
#include <stdio.h>
#include <string.h>
#define MAX_N 20 //字符串的最大数目
#define MAX_LEN 256 //字符串的最大长度(含结束符'\0')
int N;//输入的字符串数
char str[MAX_N][MAX_LEN];//保存所有字符串
int Len[MAX_N];//保存字符串的长度
//字符串匹配,成功返回1,失败返回0
int str_match(char *s1, char *s2, int len)
{
while(len > 0)
{
if(*s1 != *s2) //如果字符不同则退出函数
return 0;
s1++; //字符相同则指针后移继续对比
s2++;
len --;
}
return 1;
}
void main()
{
int i,s,t,l;
printf("请输入字符串的数目N(N<=%d):\n", MAX_N);
scanf("%d",&N); //输入字符串的个数
fgets(str[N], MAX_LEN, stdin); //输入要对比的字符串的个数N
printf("请输入%d个字符串(每个字符串以回车结束):\n",N);
for(i=0; i<N; i++) //创建N个字符串并记录所有字符串的长度
{
fgets(str, MAX_N, stdin);
Len = strlen(str);
}
for(l=Len[0]; l>0; l--)
{
for(s=0; s+l-1 < Len[0]; s++)
{
int flag1 = 1; //作为对比是否成功的一个标识
for(i=1; i<N; i++) //把第一个字符串
{
int flag2 = 0; //作为对比是否成功的一个标识
for(t=0; t+l-1 < Len; t++) //循环Len(i)-l+1次
{
if(str_match(str[0]+s,str+t,l)) //调用函数对比字符
{
flag2 = 1; //如有相同字符则重新赋值
break;
}
}
if(!flag2) //对比失败
{
flag1 = 0;
break;
}
}
if(flag1) //对比成功
{
printf("最长公共子串为:\n");
goto L;//跳到输出
}
}
}
L: for(i=0; i<l; i++) //输出最长公共子串
{
printf("%c",*(str[0]+s+i));
}
printf("\n");
}
作者: zghnyyez445 时间: 2016-4-14 20:20
膜拜,这题还不简单{:3_46:}
作者: 张立鹏 时间: 2016-4-14 21:37
这个题解得好
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |