KMP算法模板

string s,t;//s为主串,t为模式串,从0开始,可以是int数组
int nextx[1005];//从1开始
int slen,tlen;
void get_next()////得到模式串str1的next[];
{
    int i=0,j=-1;
    nextx[0]=-1;
    while(i<tlen)
    {
        if(j==-1||t[i]==t[j])
     		next[++i]=++j;
        else
            j=nextx[j];
    }
}
int kmp_count()////kmp算法求模式串在主串中出现的次数;
{
    int i=0,j=0,ans=0;
    while(i<slen)
    {
        if(t[j]==s[i]||j==-1)
        {
            i++;
            j++;
        }
        else
            j=nextx[j];
        if(j==tlen)//通过next[]求得的j如果和模式串的长度相等就说明模式串在主串中出现了;
        {
            ans++;
            j=nextx[j]+j;
        }
    }
    return ans;
}
int kmp_index()////返回首次出现的位置,从0开始
{
    int i=0,j=0;
    while(i<slen&&j<tlen)
    {
        if(j==-1||s[i]==t[j])
        {
            i++;
            j++;
        }
        else
            j=nextx[j];
    }
    if(j==tlen)
        return i-tlen+1;
    else
        return -1;//匹配不成功
}
int main()
{
    while(cin>>s)
    {
        if(s[0]=='#')
            return 0;
        cin>>t;
        slen=s.length();
        tlen=t.length();
        get_next();//处理完了字符数组接着执行构造nextx数组
        cout<<kmp_count()<<endl;
    }

你可能感兴趣的:(KMP)