您的位置:首页 > 其它

时间复杂度为m+n,的一种模式匹配,适合子串不是很长的匹配

2015-08-23 10:30 363 查看
子串长度应该小于 (int类型表示最大值)/256

//自己想出来的模式匹配算法,记得在蓝桥杯比赛中用过,方法应该早就存在了,我也不知道叫什么

#include<stdio.h>
#include<string.h>
#include<malloc.h>

int KMP_ADD(char * s ,char * t ,int pos) ;//返回pos之后的子串t在主串s中第一次出现的位置,不存在返回-1

int main (){

int i ;
i = KMP_ADD("1234123","123" ,0);
printf("%d" , i) ;
return 0;
}

int KMP_ADD(char * s ,char * t ,int pos){

int s_l = strlen(s) ;
int t_l = strlen (t) ;
// printf("%d %d \n",s_l,t_l);
int i , j , t_sum,s_sum ;
char *sc ;
sc = (char*)malloc ((t_l+1)*sizeof(char)) ;
if (sc == NULL)
return -1 ;

if (s_l-pos < t_l)
return -1;

for( i =0 ,t_sum = 0; i<t_l ; i ++){

t_sum+=t[i] ;

}
for (i=pos,s_sum=0 ; i<s_l ; i++){

s_sum+=s[i] ;
if (i>=pos+t_l-1){
if (s_sum == t_sum){
strcpy(sc,&s[i-t_l+1]);
sc[t_l] = '\0';
if (!strcmp(sc,t)){
free(sc);
return i-t_l+1;
}else{
s_sum -= s[i-t_l+1];
}
}else{
s_sum -= s[i-t_l+1];
}
}

}
free(sc);
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: