KMP算法基础版
相对于朴素匹配算法而言,去掉了i值回溯,整个算法时间复杂度为O(n+m)
朴素模式算法时间复杂度为O((n-m+1)*m)
//KMP基础版
#include <iostream>
using namespace std;
const int MAXSIZE = 255;
typedef struct{
char ch[MAXSIZE+1];
int length;
}SString;
void get_next(SString T, int *next);
int Index_KMP(SString S, SString T, int pos);
void put_String(SString &T);
int main()
{
SString a, b;
put_String(a);
put_String(b);
cout << Index_KMP(a, b, 1);
return 0;
}
void get_next(SString T, int *next)
{
int i = 1, j = 0;
next[1] = 0;
while (i < T.length)
{
if (j == 0 || T.ch[i] == T.ch[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int Index_KMP(SString S, SString T, int pos)
{
int i = pos, j = 1;
int next[255];
get_next(T, next);
while (i <= S.length && j <= T.length)
{
if (j == 0 || S.ch[i] == T.ch[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j > T.length)
return i - T.length;
return 0;
}
void put_String(SString &T)
{
int i;
cin >> T.length; //输入字符串长度
for (i = 1; i <= T.length; i++)
cin >> T.ch[i];
}