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需要变化的位置
如图中第四步跳转的介绍
此时的问题就是如何求得下一次跳转时的i与j的值
这个地方就是我比较我自己
类似回文
跳转代码:
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(char a[], int b[])
{
int i = 1;
b[0] = 0;
while (i < 8)
{
for (int j = 0; j <= i; j++)
{
if (a[j] == a[i-j])
{
b[i]++;
}
else
{
break;
}
}
i++;
}
}