KMP字符串匹配,字串
2014-08-28 16:47
246 查看
题意:输入多组,判断str2是否是str1的字串,是则输出串1在串2中的位置,否则输出-1;
//当主串中第i个字符与模式中第j个字符“失配”时,
//主串中第i个字符应该与模式中哪个字符再比较。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str1[1000000],str2[1000000];
int next[1000000];
void getnext(int t)//next[j]表示当模式中第j个字符与主串中相应字符“失配”时,在模式中需要重新和主串中该字符进行比较的字符的位置。
{
int i,j;
i=1;j=0;next[i]=0;
while(i<=t)
{
if(j==0||str2[i-1]==str2[j-1])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
}
int KMP(int s,int t)
{
int i,j;
i=1;j=1;
while(i<=s&&j<=t)
{
if(j==0||str1[i-1]==str2[j-1])
{
i++;j++;
}
else
j=next[j];
}
if(j>t)
return (i-t);
else
return -1;
}
int main()
{
int s,t,g;
while(~scanf("%s%s",str1,str2))
{
s=strlen(str1);
t=strlen(str2);
getnext(t);
g=KMP(s,t);
printf("%d\n",g);
}
return 0;
}
//当主串中第i个字符与模式中第j个字符“失配”时,
//主串中第i个字符应该与模式中哪个字符再比较。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str1[1000000],str2[1000000];
int next[1000000];
void getnext(int t)//next[j]表示当模式中第j个字符与主串中相应字符“失配”时,在模式中需要重新和主串中该字符进行比较的字符的位置。
{
int i,j;
i=1;j=0;next[i]=0;
while(i<=t)
{
if(j==0||str2[i-1]==str2[j-1])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
}
int KMP(int s,int t)
{
int i,j;
i=1;j=1;
while(i<=s&&j<=t)
{
if(j==0||str1[i-1]==str2[j-1])
{
i++;j++;
}
else
j=next[j];
}
if(j>t)
return (i-t);
else
return -1;
}
int main()
{
int s,t,g;
while(~scanf("%s%s",str1,str2))
{
s=strlen(str1);
t=strlen(str2);
getnext(t);
g=KMP(s,t);
printf("%d\n",g);
}
return 0;
}
相关文章推荐
- 算法|KMP:字符串匹配(人话版)
- kmp字符串匹配模板(c++) 4000
- 字符串匹配算法:KMP
- 【jzoj4624】【字符串匹配】【kmp】
- 字符串匹配算法之BF vs KMP
- 洛谷 P3375 【模板】KMP字符串匹配
- 字符串匹配算法-KMP整理(英文)
- 字符串匹配的KMP做法
- POJ 3461 Oulipo(KMP字符串匹配)
- 字符串匹配のKMP【专题@AbandonZHANG】
- 洛谷 P3375 【模板】KMP字符串匹配
- P3375 【模板】KMP字符串匹配
- 数据结构与算法之KMP 字符串匹配
- 字符串匹配-KMP、BF算法
- KMP字符串匹配,next数组的求解
- KMP字符串匹配
- P3375 【模板】KMP字符串匹配
- KMP 字符串匹配 SDNU 1100 字符串查找 HDU 2087 剪花布条
- 字符串匹配 KMP
- KMP字符串匹配