BF算法
代码实现:
#include<stdio.h> #include<stdlib.h> #include<string.h> int BF(const char* s,char* sub,int pos) { int i = pos;//源字符串匹配的初始位置 int j = 0;//目标字符串初始位置 int slen = strlen(s); int sublen = strlen(sub); while(i < slen && j < sublen) { if(s[i] == sub[j]) { i++; j++; } else { i = i-j+1;//源字符串初始位置向前走一步 j = 0;//目标字符串回到首位置 } } if(j >= sublen) { return i-j;//匹配成功,返回源字符串刚开始比较位置 } else { return -1;//匹配失败,返回-1 } } int main() { char* s = "ababcabc"; char* sub = "abca"; printf("%d\n",BF(s,sub,0)); printf("%d\n",BF(s,sub,3)); return 0; }
KMP算法
代码实现:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> void GetNext(int* next,const char* sub)//获取next数组 { int sublen = strlen(sub); next[0] = -1; next[1] = 0; int i = 2; int k = 0; while(i < sublen) { if((k == -1) || (sub[k] == sub[i-1])) { next[i++] = ++k; } else { k = next[k]; } } } int KMP(const char* s,char* sub,int pos) { int i = pos;//源字符串匹配的初始位置 int j = 0;//目标字符串初始位置 int slen = strlen(s); int sublen = strlen(sub); int* next = (int*)malloc(sublen * sizeof(int)); assert(next != NULL); GetNext(next,sub); while(i < slen && j < sublen) { if(s[i] == sub[j]) { i++; j++; } else { j = next[j];//i不变,j回退 } } free(next); if(j >= sublen) { return i-j;//匹配成功,返回源字符串刚开始比较位置 } else { return -1;//匹配失败,返回-1 } } int main() { char* s = "ababcabc"; char* sub = "abca"; printf("%d\n",KMP(s,sub,0)); return 0; }