模式匹配就是在字符串string中寻找模式pat,c语言中有内置函数strstr。但是今天我学了更快的算法(线性时间复杂性!)——————KMP算法。
这个算法是用三个作者的名字命名的,分别是Knuth,Morris和Pratt。
首先要了解失配函数:
f(j) = i当且仅当i<j且p【0】p【1】...p【i】 = p【j-i】p【j-i+1】...p【j】
否则f(j) = -1
也就是寻找部分匹配,j!=0时从失配字符开始和pf(j-1)+1重新开始比较,j==0时从失配字符的下一个字符和p0重新开始比较。
#include<stdio.h>
#include<string.h>
#define max_string_size 100
#define max_pattern_size 100
int failure[max_pattern_size];
char string[max_string_size];
char pat[max_pattern_size];
int pmatch(char *string,char *pat)
{
int i = 0, j = 0;
int lens = strlen(string);
int lenp = strlen(pat);
while (i < lens && j < lenp)
{
if (string[i] == pat[j])
{
i++;
j++;
}
else if (j==0)
{
i++;
}
else
{
j = failure[j - 1] + 1;
}
}
return ((j