串匹配-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)

posted @ 2011-11-10 10:19  windmissing  阅读(150)  评论(0)    收藏  举报