#include<iostream>
#include<stdio.h>
#include<string.h>
#define maxSize 100
using namespace std;
char *str = new char[10000];
char *s = new char[maxSize];
int *next = new int[maxSize];
void getNext()
{
int len = strlen(s);
next[0] = -1;
// i 定位于0,由于无法向前匹配也无法向前求取next[next[i]],所以属于结束条件
int i=0,k = -1;
while(i < len)
{
// 注意放置顺序,由于短路效应,应该先判断k的值如果为-1直接跳出
while( k!=-1 && s[i] != s[k])
{
// 求(MAX)子串,可能子串里面包含更小子串
// 向前缩短直到缩短到0,终止条件为与第一个不相等,向前调到-1
k = next[k];
}
// 满足结束条件直接赋值 0
// 由next[i-1] = k-1成立,符合条件s[i]==s[k],则可以得到next[i] = k;
// k = -1与s[i]==s[k]为对立事件
if(k==-1||s[i]==s[k])
{
++i,++k;
next[i] = k;
}
}
return ;
}
int main()
{
while(scanf("%s",str)!=-1)
{
//printf("%s\n",s);
scanf("%s",s);
getNext();
printf("\n");
int sLen = strlen(s);
int strLen = strlen(str);
// 下标定位两串开头
int i = 0,k=0;
while(i < strLen)
{
while(k!=-1&&str[i]!=s[k])
{
k = next[k];
}
// 注意i右移时k的复位
if(k==-1 || str[i]==s[k]) // 这个条件可以省略
++i,++k;
if(k==sLen)
break;
}
if(k==sLen)
printf("成功!\n");
}
return 0;
}
kmp算法
最新推荐文章于 2023-04-09 17:43:52 发布