串匹配-KMP
1 #include <string>
2 #define MAX 10000
3 int kmp(string str,string pat)
4 {
5 int ls = str.length();
6 int lp = pat.length();
7 int fail[MAX] = {-1}, i ,j;
8 for(j = 1; j < lp; j++)
9 {
10 i = fail[j-1];
11 while(i >= 0 && pat[i+1] != pat[j])
12 i = fail[i];
13 if(pat[i+1] == pat[j])
14 fail[i] = i+1;
15 else fail[j] = -1;
16 }
17 for(j = i = 0; i < ls && j < lp; i++)
18 {
19 if(str[i] == pat[j])
20 j++;
21 else if(j)
22 {
23 j = fail[j-1] + 1;
24 i--;
25 }
26 }
27 if(j == lp)
28 return i-lp;
29 else return -1;
30 }
1.头文件是<string>,不是<string.h>,后者用于C而前者用于C++
2.str是匹配串,pat是模式串
3.先以pat进行自匹配,匹配的结果保存于fail[]中
4.fail[i]的含义是:如果前i个字条匹配成功,第i+1个字符匹配失败,则从第fail[i]+1个字符开始继续匹配
5.若匹配成功,则返回位置,位置是从0开始记数的;若失败,则返回-1
6.时间复杂库O(m+n)

浙公网安备 33010602011771号