kmp算法c++实现

#include <iostream>
#include <cstring>

using namespace std;

void getNext(const char *str, int *next) {
    int i = 0, j = -1;
    next[0] = -1;
    while (i < strlen(str) - 1) {
        if (j == -1 || str[i] == str[j]) {
            ++i;
            ++j;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
}


int KMP_index(const char *mainStr, const char *patternStr, int *next) {
    int i = 0, j = 0;
    cout << "patternStr length: " << strlen(patternStr) << endl;
    cout << "mainStr length: " << strlen(mainStr) << endl;
    int mainLen = strlen(mainStr); // 不能直接用size_t, 负数和无符号整数比较会产生错误
    int patternLen = strlen(patternStr);
    while (i < mainLen &&  j < patternLen) {
        if (j == -1 || mainStr[i] == patternStr[j]) {
            ++j;
            ++i;
        } else {
            j = next[j];
        }
    }

    if (j >= strlen(patternStr)) {
        return i - (int)strlen(patternStr);
    } else {
        return -1;
    }

}


int main() {


    const char *mainStr = "abbabababba";
    const char *patternStr = "abab";
    int *next = new int[strlen(patternStr)];
    getNext(patternStr, next);
    cout << "next array:  ";
    for (int i = 0; i < strlen(patternStr); ++i) {

        cout << next[i] << " ";

    }
    cout << endl;
    cout << KMP_index(mainStr, patternStr, next) << endl;

    delete[](next);

    return 0;
}

结果

next array:  -1 0 0 1 
patternStr length: 4
mainStr length: 11
3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值