1.朴素的模式匹配算法(BF算法) 时间复杂度O(m*n) 主串n >> 模式串m
#include<iostream>
#include <windows.h>
using namespace std;
int BF(char S[],char T[])
{
int index=0;
int i=0,j=0;
while((S[i]!='\0')&&(T[j]!='\0'))
{
if(S[i]==T[j])
{i++;j++;}
else //i j分别回溯
{
index++;
i=index;
j=0;
}
}
if(T[j]=='\0') //返回本趟匹配开始位置的下标
return index+1;
else return 0;
}
void main()
{
char S[10]={1,2,3,4,5,6,7,8,9,0};
char T[10]={6,7,8,9,0};
int result=BF(S,T);
cout<<result;
Sleep(5000);
}
2.KMP算法 时间复杂度O(n) n是主串的长度
用蛮力法求模式T的next的值,KMP算法只需要将主串扫描一遍
//主串i不回溯,j回溯到根据next数组判断的位置 j=next[j];
//(如果j=-1,i和j分别加1,准备下一趟的比较)
//如果模式串T比较完毕,返回本趟最开始位置,否则返回0
//**next数组仅仅与模式串T有关
#include<iostream>
#include<windows.h>
#include <string.h>
using namespace std;
void GetNext(char T[ ], int next[ ]);
int KMP(char S[],char T[]);
int main()
{
char S[]="ababcabcacbab";
char T[]="abcac";
int index = KMP(S,T);
for (int i = 1; i < index; i++)
cout<<" ";
cout<<T<<"在"<<endl;
cout<<S<<"中的位置是:"<<index<<endl;
Sleep(80000);
return 0;
}
int KMP(char S[],char T[])
{
int i = 0, j = 0;
int next[80] = {-1};
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;
}
void GetNext(char T[], int next[])
{
int i, j, 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;
}
}