C++实现KMP算法(单值返回版)

来源:互联网 发布:怎么做淘宝图片 编辑:程序博客网 时间:2024/03/28 17:39
/* * 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.}}//whilereturn 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;}//whilereturn -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;}

0 0