您的位置:首页 > 其它

[模板]-KMP字符串匹配

2017-09-03 11:49 106 查看

学习资料

严蔚敏:

上:http://v.youku.com/v_show/id_XODYxNjExODQ=.html(开始于第 34分钟)

下:http://www.56.com/u28/v_NjAwMzA0ODA.html

《大话数据结构》

代码

char s[1000010],t[1010];//s是主串,t是模式串
int NEXT[1010],lens,lent;//next数组,直接写next会CE,可以先写成next提交时用替换换成不会CE的形式
void GetNext()//求解NEXT数组其实就是一个模式串自我匹配的过程
{
NEXT[1] = 0;//初始化(根据next函数的定义)
int j = 0;
for(int i = 2; i <= lent; ++i)//不能从1开始,防止前缀=后缀=整个串的情况
{
while(j > 0 && t[i] != t[j + 1])//如果不相等且还能向前跳的话,就跳(注意j > 0要写在前面)
j = NEXT[j];//向前跳
if(t[i] == t[j + 1])//如果相等,j++匹配下一个字符
j++;
NEXT[i] = j;//记录
}
}
void KMP(char s[],char t[])//主串s,模式串t,求解思路同上
{
GetNext();//求解next数组
int j = 0;
for(int i = 1; i <= lens; ++i)//i从1开始
{
while(j > 0 && s[i] != t[j + 1])//如果不相等且还能向前跳的话,就跳
j = NEXT[j];
if(s[i] == t[j + 1])//相等就j++
j++;
if(j == lent)//如果匹配成功
printf("%d\n", i - lent + 1);//输出匹配成功的位置
}
}
int main()
{
scanf("\n%s\n%s",s + 1,t + 1);//下标从1开始!很巧妙
lens = strlen(s + 1);//主串长度
lent = strlen(t + 1);//模式串长度
KMP(s,t);//调用
for(int i = 1; i <= lent; ++i)//输出NEXT数组
printf("%d ",NEXT[i]);
printf("\n");
return 0;
}


解决方法

根据自己的需求,灵活地套用模板
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: