KMP算法 (c++ 构造完整的DFA)
2017-10-14 19:48
176 查看
vi kmp.h
main.cpp
#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算法中关于构造DFA部分的纠结
- 第一个完整c/c++框架的构造学习——出自传智扫地僧c++教程
- 逐步理解KMP算法C++完整实现
- C++构造与析构(16) - virtual构造函数
- 一家外企公司完整面试题和答案 Basic C/C++ (CC++ Programming interview questions and answers)
- !KMP算法完整教程
- [C/C++标准库]_[初级]_[构造文件路径(stringByAppendingPathComponent)]
- C++ 运算符重载和拷贝构造
- C++拷贝构造的优化
- C++ 运算符重载和拷贝构造(二)
- C++ STL vector(向量容器)的使用(附完整程序代码)
- C++第9周趣味题参考——构造“菜单”
- 【★】KMP算法完整教程
- c++实现0-1背包问题完整源码(动态…
- c++ 带参数构造全局变量实现方法
- C++对传参合传返回值时构造的优化处理
- 用汇编的眼光看C++(之class构造、析构)09
- [C++]多个对象构造、析构、构造和析构的顺序
- C++ 构造/析构函数中的异常处理
- 关于C++继承体系中类的构造与析构的顺序【转贴】