作者: Turbo时间限制: 1S章节: 字符串
输入两个字符串,获取两个字符串中最长相同子串并输出。
如果有多个相同子串,则输出(按ASCII排序)最小的那个“最长相同子串”。
如果无相同子串,则输出空字符串(即空行)。
输入多组测试数据,每组测试数据包含两行。
每行包含一个字符串,字符串中无空格,也无空字符串。
对于每组测试数据,输出最长子串。如果最长子串为空,则输出一个空行。
每组输出占一行,行首与行尾无多余空格,也无多余空行。
abcded123456aabbcc
abcdaa1234
abcdabcdabcd
abcda
1234
abcda
方法比较笨,如果大佬有其他的方法欢迎指点
#include
#include
#include
#include
int kmp(char temp[],char s1[])//用来判断temp字符串是否在s1中,方法就是一个位置一个位置对比看是否相同,是return 1,否return 0.
{
int flag=1,i,j;
int len1,len2;
len1=strlen(s1);
len2=strlen(temp);
//printf("%d,%d\n",len1,len2);
for(i=0;i<len1-len2+1;i++)//外层循环用来控制s1的检测下标,i是temp用来检测对应s1的起始位置,起始位置在(len1-len2)之后的话,就不可能在s1中了,因为之后的元素一共也不够len2个。
{
flag=1;
int tail=i;//tail用于检测s1中的元素
for(j=0;j<len2;j++)
{
if(temp[j]==s1[tail])//如果当前位置相同,比对下一个
{
tail++;
}
else
{
flag=0;//只要有一个不同,起始位置就+1;重新检测
break;
}
}
if(flag==1)
return 1;
}
return 0;
}
int main()//主要方法就是把s2进行从大到小,从前到后进行切分,把每一次切分的字符串装在temp中,然后检测temp是否在s1出现过。
{
char s1[100];//s1存长字符串
char s2[100];//s2存短字符串
char rst[100];//rst存放目标子串
int len1,len2;
while(gets(s1))
{
int flag=0;//flag用于标志s2中的元素是否在s1中出现过,出现过就标志为1
gets(s2);
int len=0;
len2=strlen(s2);
for(int i=0;i<len2;i++)//开始切分,头从0开始,尾从最后一个元素开始,这样的切分是最大的情况
{
for(int j=len2-1;j>=i;j--)//j用于控制尾,切分长度递减
{
if((j-i+1)<len)//如果切分长度已经比rst的长度短,就直接跳出循环,头+1,然后再从大到小切分
{
break;
}
else
{
int p=0;//p控制temp下标
char temp[100];//temp存放当前切分的子串
for(int k=i;k<=j;k++)
{
temp[p++]=s2[k];
}
temp[p]='\0';
//puts(temp);
if(kmp(temp,s1))//如果temp在子串中,将flag置1,意思是s1中有s2的相同子串
{
flag=1;
if(j-i+1>len||(j-i+1==len&&strcmp(temp,rst)<0))//如果temp在子串,而且temp的长度比rst的长,或长度相同,ASCII码小,则将目标输出子串rst换成temp
{
len=j-i+1;//同时将目标子串的长度也改变,用于下一次比较
strcpy(rst,temp);
}
}
}
}
}
if(flag==1)
puts(rst);
else
printf("\n");
}
return 0;
}
用一个例子演示:
输入s1:abcded123456aabbcc
输入s2:abcdaa1234
当前temp值为:abcdaa1234
当前temp值为:abcdaa123
当前temp值为:abcdaa12
当前temp值为:abcdaa1
当前temp值为:abcdaa
当前temp值为:abcda
当前temp值为:abcd
此时的rst为:abcd
当前temp值为:bcdaa1234
当前temp值为:bcdaa123
当前temp值为:bcdaa12
当前temp值为:bcdaa1
当前temp值为:bcdaa
当前temp值为:bcda
当前temp值为:cdaa1234
当前temp值为:cdaa123
当前temp值为:cdaa12
当前temp值为:cdaa1
当前temp值为:cdaa
当前temp值为:daa1234
当前temp值为:daa123
当前temp值为:daa12
当前temp值为:daa1
当前temp值为:aa1234
当前temp值为:aa123
当前temp值为:aa12
当前temp值为:a1234
当前temp值为:a123
当前temp值为:1234
此时的rst为:1234
最后输出1234