/*
* 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.
next[++i] = ++j; // record next.
else if (j != 0) // doesn't matched.
j = next[j]; // back trace.
else // nomatched.
next[++i] = 0;
}//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;
}
C++实现KMP算法(修正版,C++风格)
最新推荐文章于 2024-06-03 11:23:16 发布