数据结构 BF算法,KMP算法,KMP改进算法
#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;
int next[100]={0};
int BF(char *s, char *t)
{
int i = 0, j = 0;
int n = strlen(s);
int m = strlen(t);
while (i < n && j < m)
{
if (s[i] == t[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= m)
return i - j;
else
return -1;
}
void getnext(char *t)
{
int i,j,k,m,n;
j=0;
k=-1;
m=strlen(t);
next[0]=-1;
while(j<m-1)
{
if(k==-1||t[j]==t[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
void getnextval(char *t)
{
int i,j,k,m,n;
j=0;
k=-1;
m=strlen(t);
next[0]=-1;
while(j<m-1)
{
if(k==-1||t[j]==t[k])
{
j++;
k++;
if(t[j]!=t[k])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
}
int KMP(char *s,char *t)
{
int i,j,k,l,n,m;
i=0;j=0;
n=strlen(s);
m=strlen(t);
while(i<n&&j<m)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=m)
return i-m;
else return -1;
}
void Showme()
{
cout << "1.BF算法查找" << endl;
cout << "2.KMP算法查找" << endl;
cout << "3.KMP改进算法查找" << endl;
}
int main()
{
char s1[100], s2[100];
cout << " 查找程序" << endl;
int f = -1;
while (f)
{
cout << "请输入原来字符串:" << endl;
cin >> s1;
cout << "请输入需要查找的字符串:" << endl;
cin >> s2;
Showme();
cin >> f;
switch (f)
{
case 1:
cout << "BF算法查找:" << endl;
cout << BF(s1, s2) << endl;
break;
case 2:
cout << "KMP算法查找:" << endl;
getnext(s2);
cout << KMP(s1, s2) << endl;
break;
case 3:
cout << "KMP改进算法查找:" << endl;
getnextval(s2);
cout << KMP(s1, s2) << endl;
break;
}
}
return 0;
}