您的位置:首页 > 编程语言 > C语言/C++

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

2017-10-14 19:48 176 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp c++ 算法