一,BF算法
暴力搜索,两重循环,具体略
二,MP算法
与BF算法不同的是,每当匹配失败,不必指针回溯,而是利用已经得到的部分匹配结果,将模式字符串滑动若干位置后,继续比较
当失配的情况发生在模式p的第j位:
1,当j=0,则让目标的指针前进一位,模式的起始比较地址回到P0
2,否则,在进行下一轮比较时,目标指针不发生回溯,仍指向失配的位置,而模式串的起始比较位置为P(f(j-1)+1)
在具体实现上,借助于Next数组,存储的为发生失配时,进行下一轮比较过程中模式p的比较地址
代码:
//p为模式字符串,t为目标字符串
void GetNext(int m){
int i=0,j=-1;
Next[0]=-1;
while(i<m){
while(j>-1&&p[i]!=p[j])
j=Next[j];
Next[++i]=++j;
}
/*Next[m]=0; 不加此句,在目标串匹配出一个,还会考虑模式串前部能否和此时目标串匹配部分的后面继续匹配
加了此句,直接目标串的下一个位置与模式串开头匹配
如ababccde
abab
加了那句,下一步是:
ababccde
abab
不加的话,是:
ababccde
abab */
return;