BF算法:
比较移动的位置,每次都只移动一个位置
每次重新比较时,总字符串a[i]中下标i和将要比较字符串b[j]中下标j都会变化
i的变化情况,每次都到本次比较开始处的第二位
所以i=i-j+1(i现在的位置减去字符串中已经比较了j个字符就等于本次的开始位置,在加一即为第二位)
j直接每次过后直接到开头
所以j=0.
代码:
int BF(SString a, SString b, int pos) //此处pos即为想要从第几个位置(数组位置)开始比较,上图都是从零开始,即pos=0
{
pos = 0;
int i = pos;
int j = 0;
while (i <= a.length && j <= b.length)
{
if (a[i] == b[i])
{
i++; j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j > b.length)
return i - j; //返回从数组a的第几个下标开始
else
return 0;
}
KMP算法
与BF差不多,只不过返回时位置不是只移动一个位置
当进行下一次比较时,不再是直接i直接跳转到第二位,j变为0,浪费资源
而是进行比较跳转到适合的位置,即i直接不变,j根据自身调整j需要变化的位置
如图中第四步跳转的介绍
这个地方需要用到next和nextval的求法:以前我的思路错了,新的一篇博客专门讲ext和nextval求法
https://blog.csdn.net/qq_46423166/article/details/106932944
跳转代码:
int BF(SString a, SString b, int pos)
{
pos = 0;
int i = pos;
int j = 0;
while (i <= a.length && j <= b.length)
{
if (a[i] == b[i] || j == 0)
{
i++; j++;
}
else{
j = next[j];
}
}
if (j > b.length)
return i - j; //返回从数组a的第几个下标开始
else
return 0;
}
需要比较的数组的自身next[]算法
void returna(String a, int nextval[])
{
int i = 1,j=0;
nextval[1] = 0;
while (i < a.length)
{
if(j==0 || a.ch[i]==a.ch[j])
{
i++;j++;
if(a.ch[i] != a.ch[j]) nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}