KMP

AB串下标都从1开始,kmp函数返回第一次成功匹配的A串下标,把其中注释去掉可以匹配多个

Next[i]表示位置长度为1-i的字符串最多有长度为Next[i]的前缀等于其后缀

char A[1000005],B[1000005] ;

int Next[1000005],lenA,lenB ;

void GetNext()

{

    int i,j ;

    Next[1]=j=0 ;  

    for(i=2 ;i<=lenB ;i++)

    {

        while(j>0 && (B[j+1]!=B[i]))j=Next[j] ;

        if(B[j+1]==B[i])j++ ;

        Next[i]=j ;

    }

}

int kmp()

{

    int i,j ;

    j=0 ;

    for(i=1 ;i<=lenA ;i++)

    {

        while(j>0 && (B[j+1]!=A[i]))j=Next[j] ;

        if(B[j+1]==A[i])j++ ;

        if(j==lenB)

        {

            return i-lenB+1 ;

            //j=Next[j] ;

        }

    }

    return -1 ;

}
View Code

 

你可能感兴趣的:(KMP)