KMP算法 (c++ 构造完整的DFA)

来源:互联网 发布:网易邮箱大师mac版 编辑:程序博客网 时间:2024/06/05 18:01

vi kmp.h

#pragma once#include <string>class KMP{private:    int **dfa;    std::string pattern;    int R;private:    void init_DFA(const std::string& p)    {        dfa[p[0]][0] = 1;        for (int j = 1, state = 0; j < p.length(); ++j)        {            for (int i = 0; i < R; ++i)            {                dfa[i][j] = dfa[i][state];            }            dfa[p[j]][j] = j + 1;            state = dfa[p[j]][state];        }       }public:    KMP(const std::string& p, const int &R = 256):dfa(new int*[R]),pattern(p),R(R)    {        for (int i = 0; i < R; ++i)            dfa[i] = new int[p.length()];        for (int i = 0; i < R; ++i)            for (int j = 0; j < p.length(); ++j)                dfa[i][j] = 0;        init_DFA(p);    }    int indexOf(const std::string& s)    {        int i, j;        for (i = 0, j = 0; i < s.length() && j < pattern.length(); ++i)        {            j = dfa[s[i]][j];        }        if (j == pattern.length())            return i - pattern.length();        else            return s.length();    }};

main.cpp

#include <iostream>#include "KMP.h"using namespace std;int main(){    KMP kmp("AACAA");    cout << kmp.indexOf("AABRAACADABRAACAADABRA") << endl;    system("pause");    return 0;}