#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;
}
動態規劃思想實現KMP算法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.