zoukankan      html  css  js  c++  java
  • KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316

    KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解大体实现了一遍,感觉还不错。其算法的效率在于next表的建立上,宗旨就是避免朴素匹配算法中的冗余回溯问题。还是直接上代码吧。

    #ifndef ALGKMP_H__
    #define ALGKMP_H__
    static class KMP
    {
    public:
        KMP(char *pattern, char *target, int &index);
        ~KMP();
    private:
        int patternLen;
        int *next;
        void calNextTable(char *pattern);
    };
    
    KMP::KMP(char *pattern, char *target, int &index)
    {
        patternLen = strlen(pattern);
        next = new int[patternLen];
        calNextTable(pattern);
        index = 0;
        while(index < strlen(target) - patternLen)
        {
            int flag = 0;
            for (; flag < patternLen; flag++)
            {
                if (pattern[flag] != target[index + flag])
                {
                    index = index+1 + flag - next[flag];
                    break;
                }
            }
            if (flag == patternLen)break;
        }
        if (index == strlen(target) - patternLen)index = -1;
    }
    KMP::~KMP()
    {
        delete[] next;
    }
    void KMP::calNextTable(char *pattern)
    {
        //int *f = new int[patternLen];
        //f[0] = 0;
        next[0] = 0;
        /*--------------待优化----------------------*/
        for (int i = 1; i < patternLen; i++)
        {
            int value = 0;
            for (int k = 0; k < i - 1; k++)
            {
                int flag = 0;
                for (flag = 0; flag <= k; flag++)
                {
                    if (pattern[flag] != pattern[i - 1 - k + flag])break;
                }
                if (flag == k + 1)value = k + 1;
            }
    
            next[i] = value + 1;
            for (int j = 0; j < i; j++)
            {
                if (pattern[i] == pattern[j])
                {
                    next[i] = next[j];
                    break;
                }
            }
        }
        //delete f;
    }
    #endif

    demo:

    #include"iostream"
    #include"AlgKMP.h"
    using namespace std;
    int main(int argv, char *argc[])
    {
      int index;
      KMP("BBBC", "BBBBCDEFG", index);
      cout <<index<< endl; 
    return 0;
    }
  • 相关阅读:
    103. 二叉树的锯齿形层次遍历
    102. 二叉树的层次遍历
    94. 二叉树的中序遍历
    Redis和数据库 数据同步问题
    203. 移除链表元素
    19. 删除链表的倒数第N个节点
    237. 删除链表中的节点
    141. 环形链表
    2. 两数相加
    143. 重排链表
  • 原文地址:https://www.cnblogs.com/meadow-glog/p/5373743.html
Copyright © 2011-2022 走看看