黑马程序员技术交流社区
标题:
本人原创代码:找出多个字符串中的最大公共子字符串
[打印本页]
作者:
xiezhongmin
时间:
2015-3-9 19:30
标题:
本人原创代码:找出多个字符串中的最大公共子字符串
这是本人自己写,真正实现多个字符串比较,的花了4个多小时实在是汗颜,若可以优化或不足请指正,多谢讨论!下面代码
#include <stdio.h>
#include <string.h>
int count = 0; // 保存用户输入了多少个字符串
char ages[100][100]; // 保存用户输入的字符串数组
char strMax[100]; // 保存公共字符串
void maxZuichangZiFu(char str[],char str1[]) //判断最长公共字符串函数
{
// 定义两个指针变量,p是保存最长公共字符串首地址,q是保存相同字符的首地址
char *p=NULL,*q=NULL;
// 定义两个整型变量,n用于保存最大公共长度,n用于保存相同字符的长度
int m=0;
int n = 0;
// 定义两个变量,保存str和str1的长度
long l1 = strlen(str);
long l2 = strlen(str1);
for(int i = 0; i<l1; i++) // 循环str字符串的长度
{
for(int j = 0; j<l2; j++) // 循环str1字符串的长度
{
m = 0; // i的每次比较m清0
// 同步比较str与str1字符串中相等的字符直到为\0时结束
for(int k = 0;str[k+i]!='\0'&& str1[k+j]!='\0'&& str[k+i]==str1[k+j]; k++)
{
m++; // 保存相同字符的数量
q = &str[i]; // 保存首地址
}
if(m>n) // 判断最大相同字符的个数
{
p = q; // 保存最大相同字符首地址
n = m; // 保存最大相同字符的个数
}
}
}
int s=0;
while(strMax[s++]!='\0')
{
strMax[s-1]='\0'; // 每次循环之前公共字符串清0
}
// 判断是否有公共子字符串
if(n>0){
// 保存最大公共子字符串
for(s=0;s<n;s++){
strMax[s]=*(p+s);
}
}
}
void yongHuShuRu() //用户输入字符串函数
{
char isYes[4]; // 保存用户输入的yes或其他字符
// 接收用户输入的字符串
printf ("请输入字符串\n");
scanf("%s",ages[count]);
printf("你存入的字符串是:ages[%d]=%s\n",count ,ages[count]);
printf ("请输入字符串\n");
scanf("%s",ages[count+1]);
printf("你存入的字符串是:ages[%d]=%s\n",count+1 ,ages[count+1]);
do
{
// 提示用户是否继续输入
printf ("是否继续输入:yes继续,其它退出。\n");
scanf("%s",isYes);
// 判断用户输入的是否为yes,若为yes继续输入,否则退出循环
if(strcmp(isYes,"yes"))
{
break;
}
else
{
printf ("请继续输入字符串\n");
scanf("%s",ages[count+2]);
printf("你存入的字符串是:ages[%d]=%s\n",count+2 ,ages[count+2]);
}
count++; // 保存用户输入了多少个字符串
}while (1);
}
int main(void)
{
yongHuShuRu(); // 调用用户输入函数
maxZuichangZiFu(ages[0],ages[1]); // 首先比较用户输入的第一和第二个字符串,取得最长公共字符串
// 拿这个最长公共字符串与其他所有字符串作比较,最后取得所有字符串中最长公共字符串
for (int i =2; i<count+2; i++)
{
maxZuichangZiFu(ages[i],strMax);
}
printf("所有字符串中最长公共字符串:%s\n",strMax); // 所有字符串中最长公共字符串
return 0;
}
复制代码
作者:
喧闹的世界
时间:
2015-3-9 19:43
没什么难度,当然,如果要专门考虑时间,空间复杂度就需要做久一点,和我的思路一样,我基础测试也是碰到了这道题。感觉定义的时候长度最好用len,别只写个l,很容易和1混淆了
作者:
xiezhongmin
时间:
2015-3-9 19:49
喧闹的世界 发表于 2015-3-9 19:43
没什么难度,当然,如果要专门考虑时间,空间复杂度就需要做久一点,和我的思路一样,我基础测试也是碰到了 ...
基础测试里应该就这题难点吧,那个啥学生管理系统就是代码多点还是算比较简单
作者:
xiezhongmin
时间:
2015-3-9 19:57
喧闹的世界 发表于 2015-3-9 19:43
没什么难度,当然,如果要专门考虑时间,空间复杂度就需要做久一点,和我的思路一样,我基础测试也是碰到了 ...
看来你算法和数据结构学的不错,以后多交流呀
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2