1. 程式人生 > >KMP字符匹配算法

KMP字符匹配算法

bsp strlen pan tps num sin using printf https

上個假期就學了KMP,但是基本不用,所以忘幹凈了。。。這個的核心思想就是next數組,next數組學名叫最長相同前綴後綴。還不錯的算法,KMP

匹配的過程中比原來的暴力匹配多了一個跳來跳去的next。

下面有一個鏈接:從頭到尾KMP,寫的很棒,很好懂!

貼板子代碼:(自己寫的註釋,有可能不對,歡迎指出)

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int next[1000005];
char s[1000005];//s為匹配串 
char t[1000005];//t為文本串 
int ans[1000005];//記錄答案 int main() { scanf("%s%s",t + 1,s + 1);//從1開始存 int ls = strlen(s + 1); int lt = strlen(t + 1); int k = 0;//k為所匹配到的最大的後綴 next[1] = 0; for(int i = 2;i <= ls;i++)//開始匹配s,建next數組 { while(k != 0&&s[i] != s[k + 1]) //後綴不相等則回到next[k] k = next[k];
if(s[i] == s[k + 1])k++; //後綴相等 next[i] = k; } k = 0; int num = 0; for(int i = 1;i <= lt;i++)//開始匹配文本串 { while(k != 0&&t[i] != s[k + 1]) k=next[k]; if(t[i] == s[k + 1])k++; if(k == ls)//如果文本串中都已經匹配到s了,記錄答案 { num
++; ans[num] = i - ls + 1; } } for(int i = 1;i <= num;i++) printf("%d\n",ans[i]); for(int i = 1;i <= ls;i++) printf("%d ",next[i]);//輸出答案 return 0; }

KMP字符匹配算法