版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhoulei_061/article/details/85111176
串的朴素算法:
- 一个一个从给定的主串的起始位置开始,从子串的开头一个一个对应匹配过去,若遇到不相等的元素,主串的搜索起始点回到起始点的下一个,子串的搜索起始点回到开头,再进行匹配。(将主串和子串的一维数组的X[0]保存为该串的长度,可以进行匹配的条件是给定的主串起始位置应<=主串的长度,子串同理)
KMP算法:
- 有种智能匹配的感觉,重点在有一个Next数组,可以少干很多不必要的、重复的匹配(少走回头路,Next数组即一个记录字符串最长公共前后缀的数组,发现不匹配了再从上一次匹配的位置出发进行搜索)
Next数组:
#include<stdio.h>
#include<string.h>
#define MAXSIZE 100001
void Next(char *T, int *next)/*Next数组*/
{
int i, j;
j = 0;
next[0] = 0;
for(i = 1;i<strlen(T);i++)
{
while(j!=0 && T[i]!=T[j])
{/*不匹配回滚*/
j = next[j];
}
if(T[i]==T[j])
{
j++;
}
next[i] = j;
}
}
int main()
{
int i;
char T[MAXSIZE];
int next[MAXSIZE];
scanf("%s", &T);
Next(T, next);
for(i = 0;i<strlen(T);i++)
{
printf("%d ",next[i]);
}
return 0;
}