黑马程序员技术交流社区
标题: 看不懂这段代码,有大神码,求指教 [打印本页]
作者: feiyiban 时间: 2016-3-18 00:43
标题: 看不懂这段代码,有大神码,求指教
//找出多个字符串中的最大公共子字符串,如“nbitheimanb”和“itheia”的最大子串是:”ithei”。(C语言)
#include <stdio.h>
#include <string.h>
int main()
{
char *s1 = "nbitheimanbcf";
char *s2 = "itheia";
void maxPublicString(char *s1,char *s2);
maxPublicString(s2,s1);
return 0;
}
void maxPublicString(char *s1,char *s2)
{
//分别求出s1,s2字符串的长度
int s1len = strlen(s1);
int s2len = strlen(s2);
//记录相同元素下标,记录相同的元素个数
int index = 0 ,count = 0;
//遍历s1
for(int i = 0; i<s1len ; i++)
{
//遍历s2
for(int j = 0; j<s2len; j++)
{
//取出s2的每一个元素s1进行比较,
if(s1[i]==s2[j])
{
//如果有相同的元素,则同时都往后面移动
for(int k = 1 ;s1[i+k]==s2[j+k] && s2[j+k]!='\0' && s1[i+k]!='\0' ;k++)
{
//选出最大公共字符串
if(k>count)
{
//记录最大公共字符串长度的下标
count =k;
//记录最大公共字符串长度的个数
index = i;
}
}
}
}
}
if(count == 0)
{
printf("没有找到最大公共子串\n");
}
else
{
printf("最长公共字串是:");
for(int i = 0 ; i<=count; i++)
{
printf("%c",s1[index+i]);
}
}
printf("\n");
}
作者: 一步一脚印=-= 时间: 2016-3-18 01:15
你不说你哪里不懂,想帮也帮不了啊...总不可能从#include开始跟你讲头文件吧
作者: alotofleo2 时间: 2016-3-18 02:43
本帖最后由 alotofleo2 于 2016-3-18 02:46 编辑
//记录最大公共字符串长度的下标
index = i
//记录最大公共字符串长度的个数
count = k
这个注释应该是写反了 ,这样应该才是对的 ,这样你应该看的懂了
作者: wanghui001001 时间: 2016-3-23 11:00
本帖最后由 wanghui001001 于 2016-3-23 11:04 编辑
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
char ch[10],ch1[10];
printf("请输入两个字符串1:");
scanf("%s",ch);
printf("请输入两个字符串2:");
scanf("%s",ch1);
for (int i = 0; i < strlen(ch); i++) {
if (ch == ch1) {
printf("%c",ch);
break;
}else{ printf("没有公共字符串")
}
}
printf("\n");
return 0;
}
看下我的,也能运行出来结果,有什么弊端和bug嘛?求指教
作者: 为梦想再启程 时间: 2016-3-24 18:21
楼上没有理解这个题意,首先是子串,其次是公共子串,最后才是最大公共子串!楼上如果把测试用例改一下,你就输出错误答案,如:
nbitheimanb”和“itiheia”的最大子串是:"hei”
我隐隐感觉这道题有点动态规划算法的影子……
作者: 为梦想再启程 时间: 2016-3-24 18:54
题主的方法是穷举法,正确。我看了书籍,动态规划里讲的是最大公共子序列,和最大公共子串的区别在于要不要求连续上。子序列不要求连续,意味着子序列有2的n次方个,而子串只有n*(n-1)/2个,量级明显不同!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |