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