1 #include<iostream>
2 #include <string>
3 #include <vector>
4 using namespace std;
5 //根据子串建表
6 template<typename T1> void buildMatch(T1 &pattern, vector<int> &match){
7 int i;
8 match[0] = -1;//将表的第一个位置置为-1
9 for(int j = 1; j < pattern.size(); j++){//从第二个元素开始比较
10 i = match[j - 1];//将match前一个坐标给i
11 while((i >= 0) && (pattern[i + 1] != pattern[j])){
12 i = match[i];//回退取出最近一个匹配的下标 (i指针从-1开始)
13 }
14 if(pattern[i + 1] == pattern[j]){//子串当前位置的元素等于i指针后一个位置指向的元素
15 match[j] = i + 1;//match[j]已经匹配子串的下标
16 }else{
17 match[j] = -1;
18 }
19 }
20 }
21
22 template<typename T1> int KMP(T1 &obj1, T1 &pattern){
23 int n = obj1.size(); //主串
24 int m = pattern.size();//被查找字串
25 if(n < m){//如果主串长度小于子串必然找不到
26 return -1;
27 }
28 vector<int> match(pattern.size());//根据子串的长度建表
29 buildMatch(pattern, match);
30 int s = 0, p = 0;//s为主串指针,p为子串指针
31 while(s < n && p < m){
32 if(obj1[s] == pattern[p]){ //主串和子串位置元素匹配
33 p++;//俩个指针同时走
34 s++;
35 }else if(p > 0){//将指针指到匹配到的最大子串的下一个位置
36 p = match[p - 1] + 1;
37 }else{//当p指向0位置时没有匹配到
38 s++;//主串指针移动
39 }
40 }
41 return p == m ? s - m : -1;
42 }
43 int main(){
44 string obj;
45 getline(cin, obj);
46 string pattern;
47 getline(cin, pattern);
48 int p = KMP(obj, pattern);
49 if(p == -1){
50 cout << "Not Found.
";
51 }else{
52 cout << p << endl;
53 }
54 // vector<int> vec(10);
55 // vector<int> vec1(3);
56 // int n = vec.size();
57 // for(int i = 0; i < n; i++){
58 // cin >> vec[i];
59 // }
60 // n = vec1.size();
61 // for(int i = 0; i < n; i++){
62 // cin >> vec1[i];
63 // }
64 // int p = KMP(vec, vec1);
65 // if(p == -1){
66 // cout << "Not Found.
";
67 // }else{
68 // cout << p << endl;
69 // }
70 return 0;
71 }
优秀博文推荐http://www.cnblogs.com/yjiyjige/p/3263858.html
http://www.cnblogs.com/c-cloud/p/3224788.html