KMP C++

来源:互联网 发布:windows无法启动sens 编辑:程序博客网 时间:2024/04/30 07:51
#include <iostream>#include <string>using namespace std;void print(const int* p, const int &n){cout << "前缀数组:";for(int i = 0; i < n - 1; i++){cout << *(p++) << " ";}cout << *p << endl;}int *prefix(const string& P){int m = P.size();int *pi = new int[m];int j = -1;pi[0] = -1;for(int i = 1; i < m; i++){while(j >= 0 && P[i] != P[j+1])j = pi[j];if(P[i] == P[j+1])++j;pi[i] = j;}return pi;}void kmp(const string& T,const string& P){int n = T.size();int m = P.size();int *pi = prefix(P);print(pi,m);int j = -1;for(int i = 0; i < n; i++){while(j >= 0 && T[i] != P[j+1])j = pi[j];if(T[i] == P[j+1])++j;if(j == m - 1){cout << "匹配位置:" << i - m + 1 << "," << i << endl;j = pi[j];}}}int main(){//string P("ababaca");string P("aba");string T("bacbababaababacaababaca");kmp(T,P);}

0 0
原创粉丝点击