KMP(DFA)
来源:互联网 发布:前端模块化编程 编辑:程序博客网 时间:2024/06/03 19:45
reference:http://algs4.cs.princeton.edu/53substring/
构建有限状态自动机,dfa[i][j]:当模式串中j位置元素和主串元素i匹配时,下一次j的位置
// 数组指针(行指针,指向数组的指针) int (*a)[4] 指向长度为4的一维数组的指针,指针指向的元素为长度为4的一维数组//使用数组指针可以传递二维数组,动态申请二维数组(可以不知第一维,但需要确定第二维)//eg int a[3][4]可以写为 int (*a)[4] 第二维的长度指定//指针数组(数组,每个元素都是一个指针) int* p[10]// Demo: 传入传出二维数组//int(*fun(int b[][100]))[100]{//return b;//}//reference:http://www.cnblogs.com/mq0036/p/3382732.html//for more info:http://blog.csdn.net/code_crash/article/details/4854965#include<iostream>#include<string>using namespace std;#define R 26 //alphabet table sizeint (*get_dfa(string pat))[100] {int dfa[R][100] = { 0 };int M = pat.length(), x = 0;dfa[(unsigned int)pat.at(0)-97][0] = 1;for (int i = 1; i < M; i++) {for (int j = 0; j < R; j++) {dfa[j][i] = dfa[j][x];}dfa[(unsigned int)pat.at(i)-97][i] = i + 1;x = dfa[(unsigned int)pat.at(i)-97][x];}return dfa;}int KMP(string x, string pat) {int (*dfa)[100] = get_dfa(pat);int i = 0, j = 0, N = x.length(), M = pat.length();for (i = 0; i <N&&j<M; i++) {j = dfa[(unsigned int)x.at(i)-97][j];}if (j == M) return i - M;else return N;}int main() {string s, pat;cin >> s >> pat;cout << KMP(s, pat) << endl;return 0;}
0 0
- KMP(DFA)
- (一)KMP算法的DFA解法
- kmp和dfa
- 从DFA角度理解KMP算法
- KMP算法DFA方式实现解析
- 查找-基于DFA的KMP字符串匹配
- 基于dfa的kmp算法思想
- KMP算法 (c++ 构造完整的DFA)
- dfa
- dfa
- dfa
- dfa
- DFA
- DFA
- dfa
- KMP算法中关于构造DFA部分的纠结
- (zz)NFA转DFA
- DFA&NFA(简易比较)
- Mutual information and Normalized Mutual information
- tinkerpop
- [生存志] 第18节 历代大事件概览 东晋
- Unity3D UGUI入门
- Linux下C++操作Redis
- KMP(DFA)
- java 线程
- linux命令--wget
- JavaScript学习笔记一
- [vijos1763] wormhole
- HDU-3038-How Many Answers Are Wrong
- 玲珑杯-【See car】
- libGDX的实体框架Ashley简介
- opencv实现图片动画效果