HDU 2594(Simpsons’ Hidden Talents)字符串匹配-KMP
2015-09-01 11:00
288 查看
题目要求串1的前缀与串2的后缀相同的最大长度。
先将两个字符串合并,求出NEXT数组。
根据NEXT数组的性质(下标1~N),NEXT的大小即为前后缀的最大相同长度。
注意LEN<=min(A.LEN,B.LEN).
代码:
#include<stdio.h>
#include<string.h>
char sp[100010],sb[50010];
int next[100010];
void Getnext(int len)
{
int i,j;
i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1 || sp[i]==sp[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int len,i,len1,len2,ans;
while(scanf("%s",&sp)!=EOF)
{
scanf("%s",&sb);
len1=strlen(sp);
len2=strlen(sb);
strcat(sp,sb);
len=strlen(sp);
Getnext(len);
ans=next[len];
if(ans>len1 || ans>len2)
{
ans=min(len1,len2);
}
for(i=0;i<=ans-1;i++)
printf("%c",sp[i]);
if(ans>=1)printf(" ");
printf("%d\n",ans);
}
return 0;
}
先将两个字符串合并,求出NEXT数组。
根据NEXT数组的性质(下标1~N),NEXT的大小即为前后缀的最大相同长度。
注意LEN<=min(A.LEN,B.LEN).
代码:
#include<stdio.h>
#include<string.h>
char sp[100010],sb[50010];
int next[100010];
void Getnext(int len)
{
int i,j;
i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(j==-1 || sp[i]==sp[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int len,i,len1,len2,ans;
while(scanf("%s",&sp)!=EOF)
{
scanf("%s",&sb);
len1=strlen(sp);
len2=strlen(sb);
strcat(sp,sb);
len=strlen(sp);
Getnext(len);
ans=next[len];
if(ans>len1 || ans>len2)
{
ans=min(len1,len2);
}
for(i=0;i<=ans-1;i++)
printf("%c",sp[i]);
if(ans>=1)printf(" ");
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- KMP算法的C#实现方法
- JavaScript中数据结构与算法(五):经典KMP算法
- C语言实现字符串匹配KMP算法
- 字符串算法--KMP--Java实现
- KMP算法(转载)
- kmp算法实现
- [OpenJudge]带有通配符的字符串匹配
- KMP算法详解
- linux kernel data struct: KMP算法实现
- 求一个字符串中连续出现次数最多的子串
- KMP算法总结
- KMP字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配/模糊匹配(查找/模糊查找)的算法
- 字符串匹配之KMP算法
- kmp
- 【hiho一下第三周】KMP计算模式串在原串出现次数
- HDU1711 模板题-KMP
- PHP展示KMP拓展算法思想
- Java实现AC自动机全文检索