串模式的匹配算法:
1.使用最基础 的BP算法,也就是从主串开始一个一个遍历字串看主串是否有包含子串,如果有返回其标记的位置。
代码如下:
int BF(char * Findstr,int sizeFindstr,char *str,int sizestr) { if(Findstr == NULL||sizeFindstr<=0||str == NULL|| sizestr<=0||sizeFindstr<sizestr)return -1; int i = 0; int j =0; for(;i<sizeFindstr;i++)n'h { for(j=0;j<sizestr;j++) { if(Findstr[i+j]!= str[j]) { break; } } if(j == sizestr) { return i; } } return -1; }
2.使用kmp算法,kmp算法是通过去寻找匹配串中重复的元素,用next数组去记入从开始元素到当前元素最大的前后缀的个数,然后在主串和子串匹配时候,如果不符和,则根据next数组进行跳转,
(本文只给出了怎么计算next数组)。
void GetNextArr(char * match,int size,int *arr) { if(match == NULL||size<=0)return ; int i = 1; int j = 0; j=i; for(i;i<size;) { if(match[i] == match[arr[j-1]]) { arr[i] = arr[j-1]+1; i++; j=i; }else if(arr[j-1]== 0) { arr[i] = 0; i++; j=i; }else { j = arr[j-1]; } } return ; }
3.Sunday算法:其申请了以char型大小的next数组,将匹配的字符是从左至右以字符的asic码存入数组,存入的数字为该字符在匹配串的位置,由于是从左至右,所以最后的字符串下标,然后通过这个
next数组去遍历比较;
int Sunday(char * Findstr,int sizeFindstr,char *str,int sizestr) { if(Findstr == NULL||sizeFindstr<=0||str == NULL|| sizestr<=0)return -1; int * arr = (int*)malloc(sizeof(int)*256); memset(arr,-1,sizeof(int)*256); int i= 0; int bj = 0; int j = 0; int bi = 0; for(;i<sizestr;i++) { arr[str[i]] = i; } for(i = 0;i<sizeFindstr;) { if(Findstr[i] == str[j]) { j++; i++; if(j == sizestr)return bj; }else { if((bj = bj+sizestr+1)<sizeFindstr) { bj = bj-arr[Findstr[bj]]; i = bj; j = 0; }else { break; } } } return -1; }