C++实现KMP算法(优化版)

来源:互联网 发布:pathfinder软件价格 编辑:程序博客网 时间:2024/03/29 13:58
/* * Main.cpp * *  Created on: Oct 7, 2015 *      Author: chris */#include<iostream>#include<vector>#include<string>using namespace std;void get_next(const string pat, vector<int>& next){next.resize(pat.length(), 0);int i = 1, j = 0;while(i < pat.length()-1) {if(pat[i] == pat[j]) {          // matched.++i; ++j;            // record next.if(pat[i] != pat[j])next[i] = j;elsenext[i] = next[j];}else if (j != 0)                // doesn't matched.j = next[j];                // back trace.else                            // no matched.next[++i] = 0;// reset.}//while}void Index_KMP(const string str, const string pat, vector<int>& inds){vector<int> next;get_next(pat, next);inds.clear();int i = 0, j = 0;while(i < str.length()) {if(str[i] == pat[j]){                               // matched.++i; ++j;                   // move on.if(j >= pat.length()) {inds.push_back(i - pat.length());j = 0;//reset.}}else if ( j != 0 )            // back trace.j = next[j];else                          // impossible.++i;}//while}int main(void){string str1, str2;while(cin >> str1 >> str2) {vector<int> inds;Index_KMP(str1, str2, inds);for(int i = 0; i < inds.size(); ++i) {cout << inds[i] << " ";}cout << endl;cout.flush();}//while.return 0;}

0 0