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