今天对这学期学的字符串匹配算法进行总结并记录。
根据清华大学出版社出版的算法设计与分析(第2版)王红梅 胡明 编著
- KMP算法基于蛮力法实现的
- KMP算法是BF算法的改进算法
- KMP 算法主要由两个函数构成。一个是next数组的获取,二是对主串S和模式串T的匹配
#include <iostream>
#include <cstring>
using namespace std;
void GetNext(char T[],int next[])
{
int i;
int j;
int len;
next[0] = -1;
for(j = 1; T[j] != '\0';j++)
{
for(len = j-1; len >= 1; len--)
{
for(i = 0;i < len; i++)
if(T[i] != T[j-len+i]) break;
if(i == len)
{
next[j] = len; break;
}
}
if(len < 1) next[j] = 0;
}
}
int KMP(char S[],char T[])
{
int i = 0, j = 0;
int next[80];
GetNext(T,next);
while(S[i] != '\0' && T[j] != '\0')
{
if(S[i] == T[j])
{
i++;j++;
}else{
j = next[j];
if(j == -1)
{
i++;
j++;
}
}
}
if(T[j] == '\0') return (i-strlen(T)+1);
else return 0;
}
int main(int argc, char** argv) {
char S[8] = {'a','b','c','a','b','a','a','\0'};
char T[5] = {'c','a','b','a','\0'};
cout << KMP(S,T) <<endl;
system("pause");
return 0;
}```