kmp匹配算法
Posted agoodday
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于kmp匹配算法的主要内容,如果未能解决你的问题,请参考以下文章