KMP(DFA)

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 size

int (*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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值