kmp匹配算法

 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.\n";
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.\n";
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

posted @ 2019-04-27 12:01  kakaluotedj  阅读(138)  评论(0编辑  收藏  举报