算法导论-第32章-字符串匹配:有限自动机方法(改进版本:预处理阶段复杂度为O(m*| ∑ |) )C++实现
来源:互联网 发布:java spring 日志记录 编辑:程序博客网 时间:2024/05/07 02:02
#include <iostream>#include <vector>#include <algorithm>using namespace std;void built_pai(char P[], int pai[], size_t m) {int k{};pai[0] = 0;for (int q = 1; q < m; ++q) {while (k > 0 && P[k] != P[q]) {k = pai[k];}if (P[k] == P[q]) {k++;}pai[q] = k;}}void built_transform_function(int* theta, char* P, char* alpha, size_t m, size_t alpha_size) {int* pai = new int[m] {};built_pai(P, pai, m);for (int i = 0; i < alpha_size; ++i) {if (alpha[i] == P[0]) {theta[i] = 1;}}for (int i = 1; i <= m; ++i) {for (int j = 0; j < alpha_size; ++j) {if (P[i] == alpha[j]) {theta[i * alpha_size + j] = i + 1;}else {int tmp = pai[i - 1];if (P[tmp] == alpha[j]) {theta[i * alpha_size + j] = tmp + 1;}else if (alpha[j] == P[0]){theta[i * alpha_size + j] = 1;}}}}delete[]pai;}int find_index_of_alpha(char alpha[], char c, int alpha_size) {for (int i = 0; i < alpha_size; ++i) {if (alpha[i] == c) {return i;}}return -1;}void finite_automation_matcher(char T[], int theta[], char alpha[], int n, int m, int alpha_size) {int q{};for (int i = 0; i < n; ++i) {q = theta[q * alpha_size + find_index_of_alpha(alpha, T[i], alpha_size)];if (q == m) {cout << "Pattern occures with shit " << i - m << endl;}}}int main(int argc, char* argv[]) {vector<char> v{};char element{};cout << "please enter the sum of alphabet (end by '0') : " << endl;while (cin >> element) {if (element != '0') {v.push_back(element);}else {break;}}size_t alpha_size{ v.size() };char* alpha = new char[alpha_size] {};int index{};for_each(v.begin(), v.end(), [=](char x)mutable{ alpha[index++] = x; });v.clear();cout << "please enter the pattern (end by '0') : " << endl;while (cin >> element) {if (element != '0') {v.push_back(element);}else {break;}}size_t m{ v.size() };char* P = new char[m] {};index = 0;for_each(v.begin(), v.end(), [=](char x)mutable{ P[index++] = x; });int* theta = new int[(m + 1) * alpha_size] {};built_transform_function(theta, P, alpha, m, alpha_size);v.clear();cout << "please enter the text (end by '0') : " << endl;while (cin >> element) {if (element != '0') {v.push_back(element);}else {break;}}size_t n{ v.size() };char* T = new char[n] {};index = 0;for_each(v.begin(), v.end(), [=](char x)mutable{ T[index++] = x; });for (int i = 0; i < n; ++i) {cout << T[i] << " ";}cout << endl;finite_automation_matcher(T, theta, alpha, n, m, alpha_size);delete[]T;delete[]P;delete[]alpha;return 0;}
0 0
- 算法导论-第32章-字符串匹配:有限自动机方法(改进版本:预处理阶段复杂度为O(m*| ∑ |) )C++实现
- Java实现算法导论中有限自动机字符串匹配算法
- 第32章 :字符串匹配—有限自动机算法,Knuth-Morris-Pratt算法
- 字符串模式匹配——KMP算法(时间复杂度为O(m+n))
- 算法导论 第32章 详解字符串的匹配,自动机,KMP算法
- KMP 算法。。。 字符串匹配 ,复杂度 O(n+m)
- 算法导论第32章 字符串匹配
- 字符串匹配的FA(有限状态自动机)算法
- 字符串匹配之有限自动机&kmp算法
- 【算法】利用有限自动机进行字符串匹配
- 字符串匹配算法之:有限状态自动机
- 算法导论-第32章-字符串匹配:Knuth-Morris-Pratt(KMP)算法C++实现
- 算法导论-第15章-动态规划:最长公共子序列(空间复杂度改进版)C++实现
- 字符串匹配算法——利用有限自动机进行匹配
- 算法导论-第32章- 字符串匹配 - KMP算法
- 算法导论-第32章-字符串匹配:Rabin-Karp算法C++实现
- 算法——字符串匹配之有限自动机算法
- 字符串匹配之有限自动机
- 使用android手机做鼠标
- eclipse Memory Analyzer进行内存泄漏分析三部曲
- Codeforces Round #275 (Div. 2)
- [iOS_Dev] UITableView 水平放置 自动循环滚动
- 屌炸天-css3水平导航下拉菜单
- 算法导论-第32章-字符串匹配:有限自动机方法(改进版本:预处理阶段复杂度为O(m*| ∑ |) )C++实现
- 第十四周项目一 二维数组折腾
- Sicily 1935 二叉树重建
- 《淘宝十年的技术之路》读后感
- ios JSON解析(异步)
- 单因素重复方差分析-理论说明
- 购物车系统
- hnu oj 13102 Super Shuttle题解
- css按钮效果(按下效果)