KMP与BF,实现了一个非主流next函数

#include <stdlib.h>
#include <string.h>

int bf(char* text, char* patten){
	int i = 0;
	int j = 0;
	while(i<strlen(text) && j<strlen(patten)){
		if(text[i] == patten[j]){
			i++;
			j++;
		}else{	
			//i回溯到 开始匹配的下一个位置 
			i = i-j+1;
			//j回溯到最开始0处 
			j = 0;
		}
	}
	//匹配到时候是j<strlen(patten)条件不满足的时候 
	return j>strlen(patten)-1 ? i-j : -1;
}

//在J位置发生不匹配以后,找到一个k使 P[0~K]==P[K+1~J]调整将J调整为K 
//这个方法也可以将next(j-1)求解出的子问题存储起来,这么写主要是为了好想 
int next(char* patten, int j){
	if(j==0||j==-1){
		return 0;
	}
	if(patten[j]==patten[next(patten, j-1)+1]){
		return next(patten, j-1)+1;
	}else{
		while(1){
			int k = next(patten, j-1);
			if(patten[j]==patten[k+1]){
				return next(patten, k);
			}
		}	
	}
}

int kmp(char* text, char* patten){
	int i = 0;
	int j = 0;
	while(i<strlen(text) && j<strlen(patten)){
		if(text[i] == patten[j] || j==0){
			i++;
			j++;
		}else{
			//j位置发生不匹配	
		    //j通过分析模式串,计算出模式串下一个比较位置和文本不匹配位置匹配 
			j = next(patten, j-1);
			
		}
	}
	return j>strlen(patten)-1 ? i-j : -1;
}

int main(){
	char* text =   "adjfskjfskdjsfkglsi";
	char* patten = "skdj";
	
	printf("%d\n",bf(text, patten));
	printf("%d\n",kmp(text, patten));
	return 0;
}

猜你喜欢

转载自wudikua123.iteye.com/blog/1490702
今日推荐