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;
}