KMP算法实现

算法这篇文章写得很明了:http://news.cnblogs.com/n/176771/

以下是实现:

KMP.cc

#include        <iostream>
#include        <cstring>
#include        <cstdlib>

// Calc partition table
void mkRpTab(const char* str, int* tab, int len)
{
    for (int i=0; i<len; ++i) {
        int j = i;
        for(; j>0; --j) {
            if (strncmp(str, str+i-j+1, j) == 0)
                break;
        }
        tab[i] = j;
        std::cout << tab[i] << "  ";
    }
    std::cout << std::endl;
}
// kmp
void kmp()
{
    const char* meterial = "BBC ABCDAB ABCDABCDABDE";
    const char* keyStr = "ABCDABD";
    std::cout << "meterial: " << meterial << std::endl;
    std::cout << "keyStr: "   << keyStr << std::endl;
    int* tab = (int *) malloc(sizeof(int) * strlen(keyStr));;
    mkRpTab(keyStr, tab, strlen(keyStr));


    int meterialLen = strlen(meterial);
    int keyLen = strlen(keyStr);
    int meterialOffset = 0;
    int keyOffset = 0;

    while (meterialOffset < meterialLen) {
        if (meterial[meterialOffset] == keyStr[keyOffset]) {
            if (keyOffset < keyLen - 1) {
                ++meterialOffset;
                ++keyOffset;
            } else {
                std::cout << "matched: " << meterialOffset - keyLen + 1 << std::endl;
                keyOffset = 0;
                ++meterialOffset;
            }
        } else {
            if (keyOffset == 0) {
                ++meterialOffset;
            } else {
                meterialOffset += (keyOffset - tab[keyOffset - 1]);
                keyOffset = 0;
            }
        }
    }

    free(tab);
}


// ===  FUNCTION  ======================================================================
//         Name:  main
//  Description:  main function
// =====================================================================================
        int
main ( int argc, char *argv[] )
{
    kmp();
        return EXIT_SUCCESS;
}               // ----------  end of function main  ----------

结果:

root >>> ./a.out
meterial: BBC ABCDAB ABCDABCDABDE
keyStr: ABCDABD
0  0  0  0  1  2  0
matched: 15

 

转载于:https://www.cnblogs.com/Leo-Forest/archive/2013/05/24/3066071.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值