串的模式匹配算法 BF算法/KMP算法(字符串匹配)

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

}

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/105647102