動態規劃思想實現KMP算法

#include <iostream>
using namespace std;
#define MAX 100 //最長子串
int dp[MAX][256] = { 0 }; //dp[狀態][字符]=下一個狀態
void next(string pat) {
	int M = pat.length();
	dp[0][pat[0]] = 1;
	int X = 0;  //影子狀態X初始爲0
	for (int j = 1; j < M; j++) {
		for (int c = 0; c < 256; c++)
			dp[j][c] = dp[X][c];
		dp[j][pat[j]] = j + 1;
		X = dp[X][pat[j]];//更新影子的狀態
	} //構建狀態轉移圖
}
int search(string pat, string txt) {
	int M = pat.length();
	int N = txt.length();
	int j = 0;
	for (int i = 0; i < N; i++) {
		j = dp[j][txt[i]]; //計算pat的下一個狀態
		if (j == M)
			return i - M + 1; //到達終止態,返回結果
	}
	return -1;//沒到達終止態,匹配失敗
}
int main() {
	string pat, txt;
	cin >> pat >> txt;
	next(pat);	
	cout<<search(pat, txt);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章