/*
* Main.cpp
*
* Created on: Oct 7, 2015
* Author: chris
*/
#include<iostream>
#include<cstring>
using namespace std;
bool get_next(const char* pat, int*& next)
{
int len = strlen(pat);
next = new int[len];
if(!next) return false;
next[0] = 0;
int i = 1, j = 0;
while(i < len) {
if(pat[i] == pat[j]) { // matched.
++i; ++j; // move on.
next[i] = j; // record next.
} else if (j != 0){ // doesn't matched.
j = next[j]; // back trace.
} else { // nomatched.
next[i] = 0;
++i; // skip.
}
}//while
return true;
}
int Index_KMP(const char* str, const char *pat, const int* next, int pos)
{
int i = pos, j = 0;
int Slen = strlen(str),
Plen = strlen(pat);
while(i < Slen) {
if(str[i] == pat[j])
{ // matched.
++i; ++j; // move on.
if(j >= Plen)
return i - Plen;
}
else if ( j != 0 ) // back trace.
j = next[j];
else // impossible.
++i;
}//while
return -1;
}
int main(void)
{
string str1, str2;
while(cin >> str1 >> str2) {
int *next = NULL;
if(get_next(str2.c_str(), next)) {
int pos = 0;
do{
int ind = Index_KMP(str1.c_str(), str2.c_str(), next, pos);
if(ind == -1)
break;
cout << ind << " ";
pos = ind + str2.length();
}while(true);
cout << endl;
} else {
cout << "failed." << endl;
}
delete next;
}//while.
return 0;
}
C++实现KMP算法(单值返回版)
最新推荐文章于 2022-10-26 22:55:02 发布