KMP

KMP_第1张图片

首先来写最大公共前缀和后缀,这里pa代表要找的字符串,p表示pa字符串里的每个位置的最大公共前缀和后缀表

#include
using namespace std;
void pp(char pa[],int p[],int n)
{
    p[0]=0;
    int len =0;
    int i=1;
    while(i0)//这里没有i++,就是为了找到合适的len
            {
                len=p[len-1];
            }
            else//注意这是对于第一项和第二项,
            {
                p[i]=len;
                i++;
            }
        }
    }
}
int main()
{
    char pa[]="ABABCABAA";
    int p[9];
    int n=9;
    pp(pa,p,n);
    for(int i=0;i

KMP_第2张图片

对于前缀表都是写成第一个是-1的形式

#include
using namespace std;
void pp(char pa[],int p[],int n)
{
    p[0]=0;
    int len =0;
    int i=1;
    while(i0)//这里没有i++,就是为了找到合适的len
            {
                len=p[len-1];
            }
            else//注意这是对于第一项和第二项,
            {
                p[i]=len;
                i++;
            }
        }
    }
}
void movee(int p[],int n)
{
    for(int i=n-1;i>0;i--)
        p[i]=p[i-1];
    p[0]=-1;
}
int main()
{
    char pa[]="ABABCABAA";
    int p[9];
    int n=9;
    pp(pa,p,n);
    movee(p,n);
    for(int i=0;i

KMP_第3张图片KMP_第4张图片

#include
using namespace std;
void pp(char pa[],int p[],int n)
{
    p[0]=0;
    int len =0;
    int i=1;
    while(i0)//这里没有i++,就是为了找到合适的len
            {
                len=p[len-1];
            }
            else//注意这是对于第一项和第二项,
            {
                p[i]=len;
                i++;
            }
        }
    }
}
void movee(int p[],int n)
{
    for(int i=n-1;i>0;i--)
        p[i]=p[i-1];
    p[0]=-1;
}
void kmp(char text[],char pa[])
{
    int n=strlen(pa);
    int m=strlen(text);
    int *p=(int*)malloc(sizeof(int)*n);
    pp(pa,p,n);
    movee(p,n);
    int i=0;
    int j=0;
    while(i

你可能感兴趣的:(KMP)