#include <iostream>
#include <string.h>
using namespace std;
int net[100];
int lens;
int lent;
int Index(char S[],char P[])//朴素的串匹配算法,即暴力求解;
{
//返回子串P 在主串S 中的位置
int i = 1;
int j = 1; // i 和j 也可能从0 开始,依赖于存储设计
while (i <= lens && j <=lent)
{
if (S[i]==P[j])
{
++i;
++j;
}
else
{
i = i-j+2;
j = 1;
}
}
if ( j>lent )
return (i-lent); //匹配成功
return -1; //匹配失败
} // Index
int Index_KMP (char S[],char T[],int pos) //模式匹配算法--KMP 算法
{
//返回子串T 在主串S 中从第pos 个字符开始的位置
//要求T 非空,1≤pos ≤Strlength(S)
int i=pos;
int j=1;
while(i<=lens && j<=lent)
{
if (j==0|| S[i]==T[j])
{
++i;
++j;
}
else
{
j=net[j];
}
}
if (j> lent)
return (i-lent);
return 0;
}
void Get_Index(char T[], int net[])// KMP 模式匹配算法---求next[j]的算法:
{
//求模式串T 的next 函数值并存入数组next
int i = 1;
net[1] = 0;
int j = 0;
while( i <= lent)
{
if ( j==0 || T[i]==T[j])
{
++i;
++j;
net[i] = j;
}
else
j = net[j];
}
} // Get_Index
int main()
{
char t[100] = " abaabcac";//书上所给代码,下标从1开始,且程度8,即在t中1-8是有字符的;
char s[100] = " acabaabaabcacaabc";
lens = strlen(s)-1;
lent = strlen(t)-1;
Get_Index(t, net);
printf("s = %d p = %d\n", lens, lent);
for(int i=1; i<=lent; i++)
{
printf("%d ", net[i]);
}
printf("\n");
int e = Index(s, t);
printf("暴力求解:%d\n", e);
e = Index_KMP(s, t, 1);
printf("KMP求解:%d\n", e);
return 0;
}