1. 程式人生 > >字串匹配——KMP演算法中的next陣列理解

字串匹配——KMP演算法中的next陣列理解

關於原理就不講了,只說下我對Next陣列的理解,希望可以讓你獲得靈光一閃。

其實最難的就是是j=Next[j];這麼一句話,當時思考了很長時間,終於明白的時候確實很興奮加得意。

#include<cstdio>
#include<cstring>
void getNext(int *Next,char* src){
	int i,j;
	Next[0]=-1;
	i=0;
	j=-1;
	int N=strlen(src);
	while(i<N-1){
		if(j==-1||src[i]==src[j]){
			++i;
			++j;
			Next[i]=j;
		}else{
		/*
			理解難點:假設已經存在Next;假設是兩個字串在進行比較。

			1.	a)假設現在有兩個字串 src (傳入的完整字串,長度為 N ) 
				   和 dest(不完全字串,從第i個位置到末尾,長度為 N-i ) 進行比較,
				b)假設Next陣列已經存在,則我回溯的時候就有位置了。

			2.	若 src 從0到第j-1個位置,與dest相同,	但是 src 在第j個位置 與字串 dest 不相同,

			3.	則 src 該回溯到Next[j]的位置重新進行比較
		*/
			j=Next[j];
		}
	}
}

int KMPMatch(char *father,char *son){
	int i,j;
	i=0;
	j=0;
	int next[15];
	getNext(next,son);

	while(i<strlen(father)){
		if(j==-1||father[i]==son[j]){
			++i;
			++j;
		}else{
			j=next[j];
		}
		
		//src的遊標j到達strlen(src),說明dest中存在src子串
		if(j==strlen(son) )
			return i-strlen(son);
	}
	return -1;

}

int main(){

	char dest[]="ABC ABCABD ABC ABD";
	char src[]="ABC ABD";

	int res=KMPMatch(dest,src);
	printf("%d\n",res);
	return 0;
}