BF&KMP算法[c语言][字符串匹配]

BF&KMP算法[字符串匹配]

BF:暴力匹配
KMP:优化后的利用回溯提高匹配效率

代码

话不多说,手敲代码来了哦~~~

//brute-force暴力算法
//KMP 算法 
#include 
#include 
#include 

typedef struct{
    char *ch;//指向动态分配储存区首地址的字符指针
    int length;//串的长度
}HString;

void assign(HString * str,char *chars);
int bfcompare(HString *parent,HString *chlid,int pos);
void Get_Next(HString child, int * next);
int KMPCompare(HString * parent, HString * child, int pos,int * next);

int main(){
	HString parent,child;
    int next[255];
	assign(&parent,"abcdefg");
	assign(&child,"fg");
	//暴风算法 
	printf("BF:%d\n",bfcompare(&parent,&child,1));
	//KMP
	Get_Next(child, next);
	printf("KMP:%d\n",KMPCompare(&parent, &child, 1,next));
	return 0;
}

void assign(HString * str,char *chars){
	int len = strlen(chars);
	
	str->ch = NULL;
    str->length = 0;
    
	str->length = len;
	str->ch = (char *)malloc(sizeof(char)*len);
	if(!str->ch){
		printf("memeory error");
	}
	for(int i = 0;i<len;i++){
		str->ch[i] = chars[i];
	}
	return;
}

int bfcompare(HString *parent,HString *child,int pos){
	 int i = pos;
	 int j  = 1;
	 while(i<=parent->length&&j<=child->length){
	 	if(parent->ch[i-1] == child->ch[j-1]){
	 		i++;
	 		j++;
		 }else{
		 	i = i-j+2; //回溯到parent的开始比较的下一个
			j = 1; 
		 } 
	 }
	 if(j>child->length){
	 	return i-child->length;//当全部符合时i后移变为现在的i,i-child的长度就是开始符合的位置 
	 }
	 return 0; 
}

/** 返回next数组(部分匹配表) */
void Get_Next(HString child, int * next){
    int i = 0;
    int j = -1;
    next[0] = -1;
    while(i < child.length){
        if(j == -1 || child.ch[i] == child.ch[j]){
            ++i;
            ++j;
            next[i] = j;
        }else{
            j = next[j];
        }
    }
}

/** 使用KMP算法进行比较,返回子串在主串中的位置 */
int KMPCompare(HString * parent, HString * child, int pos,int * next){
    //int next[255];  //用来存放部分匹配值
    //Get_Next(*child, next); //首先处理子串,计算出部分匹配值
    //已近将next数组传入 
    int i = pos - 1;
    int j = 0;
    while(i < parent->length && j < child->length){
        if(j == -1 || parent->ch[i] == child->ch[j]){
            ++i;
            ++j;
        }else{
            j = next[j];
        }
    }
    if(j == child->length){
        return (i + 1) - j;
    }
    return 0;
}

你可能感兴趣的:(数据结构_java实现,c语言,BF,KMP,字符串匹配,算法)