KMP算法简介
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。时间复杂度O(m+n)。
KMP算法通过确定有限状态自动机DFA实现。
实现过程
字符串ABABAC
的DFA:
通过DFA搜索字符串BCBAABACAABABACAA
:
代码实现
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include <string.h>
#include "Queue.h"
#define LENGTH 6
#define WORDLENGTH 3
#define CHARLENGTH 256
#define TRUE 1
#define FALSE 0
void dfaBuild(char *a, int dfa[][CHARLENGTH]) {
for (int i = 0; i < LENGTH; i++) {
for (int j = 0; j < CHARLENGTH; j++) {
dfa[i][j] = 0;
}
}
dfa[0][a[0]] = 1;
for (int X = 0, i = 1; i < LENGTH; i++) {
for (int j = 0; j < CHARLENGTH; j++) {
dfa[i][j] = dfa[X][j];
}
dfa[i][a[i]] = i + 1;
X = dfa[X][a[i]];
}
}
int kmp(char *pat, char *txt) {
int dfa[LENGTH][CHARLENGTH];
dfaBuild(pat, dfa);
int N = strlen(txt), M = strlen(pat);
int i, j;
for (i = 0, j = 0; i < N && j < M; i++)
j = dfa[j][txt[i]];
if (j == M) //找到匹配
return i - M;
else //未找到匹配
return N;
}
void main() {
char *pat = "ABABAC";
char *txt = "BCBAABACAABABACAA";
printf("%d\n", kmp(pat, txt));
}