黑马程序员技术交流社区
标题: 求助 关于C语言求最大公共字符串。 [打印本页]
作者: 87526845 时间: 2015-1-26 09:45
标题: 求助 关于C语言求最大公共字符串。
运行起来有时候是对的,但有时候又不对。
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[100];
char ch2[100]; //定义2个字符数组用语保存键盘输入的字符
printf("请输入一串字符:");
scanf("%s",ch1);
printf("请再输入一串字符:");
scanf("%s",ch2);
int length1 =strlen(ch1);
int length2 = strlen(ch2); //取的2个字符串的长度用于遍历
int count=1;
int max=0,which=0; //定义3个整型数组用于保存值。
for (int i =0;i<length1;i++)
{ for(int j=0;j<length2;j++)
{
if (ch2[j]==ch1) //当2个字符数组中有第一个字母相等的时候,进行下面的筛选。
{
if ((ch2[j+1]==ch1[i+1])&&j+1<=length2&&i+1<=length1)
{
count++; //在第一个字母相等之后如果第二个字母也相等,且其没有超过字符串 总长度,时候其相等的个数+1.
}
else
{
break; //如果第二个字母不相等,或者长度超过了退出这次循环
}
if (max<count)
{
max =count; //找出最大的相等值,并且通过个数来确定此时字母串从哪一个开始相等的。
which =i+2-count;
}
else
{
count =1;
}
}
}
}
for(int i=0;i<max;i++)
{
printf("%c",ch1[which+i]);
}
printf("\n");
return 0;
}
下面是运行的图
-
2.jpg
(99.88 KB, 下载次数: 16)
作者: 曼珠沙华 时间: 2015-1-26 09:45
#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");
}
你试试,我运行没有问题
作者: 87526845 时间: 2015-1-26 09:46
图最下面那次运行结果就不对了
作者: 87526845 时间: 2015-1-29 20:48
我最想知道我哪里不对的。
作者: marswawa 时间: 2015-3-18 14:14
我的思路是用矩阵,来做,简单的说就是挨个扫描,用a字符串中的每一个字母去和b字符串中的字符比对,如果相同就用1来记录,如果不相同就用0来记录,等第二个字符比对的时候先判断自己之前比对的结果如果是1就标记为2如果为0就标记为1,也就是在前一位记录的基础上再加一,这样最后会得到一个一维数组,如[1,3,5,6],当然这个数组的长度取决于两个字符串中最大的字符串的长度,我们遍历此数组找到6,6的意思是说这两个字符串的最大公共字符串的长度是6,而恰恰6的索引位置就是最大公共字符串的最后一个字符所在的索引位置。以此就可以取出最大公共字符串,做完此题我感觉编程才是世界上最伟大的艺术。
作者: tt3tt3tt 时间: 2015-7-31 19:51
我也被抽到这题
#include<stdio.h>
#include<string.h>
#define N 20
int result=0;
void main()
{
char a[N],b[N];
int l1,l2,i,j,max,flag,cont;
printf("请输入第一个字符串(长):");
gets(a);
printf("请输入第二个字符串(短):");
gets(b);
max=flag=0;
l1=strlen(a);
l2=strlen(b);
for(i=0;i<l1;i++)
{
for(j=0;j<l2;j++)
{
if(a[j+i]-b[j])
{
if (cont>max)
{
max=cont;
result=i+j-cont;
}
flag=0;
cont=0;
}
else flag=1;
if(flag) cont++;
}
if (cont>max)
{
max=cont;
result=i+j-cont;
}
}
while(max)
{
printf("%c",a[result]);
result++;
max--;
}
printf("\n");
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |