子串查詢

weixin_46250672發表於2020-11-04

這是一道模板題。

給定一個字串 a和一個字串b ,求 b在 a 中的出現次數。 和 中的字元均為英語大寫字母或小寫字母。

中不同位置出現的 可重疊。

輸入格式
輸入共兩行,分別是字串 a和字串b 。

輸出格式
輸出一個整數,表示 b 在 a中的出現次數。

樣例
樣例輸入
zyzyzyz
zyz
樣例輸出
3
我迷惑的地方是為啥 i++,j++,next[i]=j;不能直接寫成next[i++]=j++;
這是一個自增自減問題 前幾天才給大一講過 沒想到栽在了這裡

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
//const int maxn=1e6+50;
int ne[1000100],len1,len2;
char a[1000100],b[1000100];
void get_next()
{
    int  j=-1,i=0;
    ne[0]=-1;
   while(i<len2)
   {
        if(j==-1||b[i]==b[j])
        {
            i++;         //i仍然是0
            j++;         //j仍然是-1
            ne[i]=j;     //在這個裡面 i已經變成1 ,j已經變成·0   ,這與ne[i++]=j++ 不一樣
        }
         else
        j=ne[j];
   }
}
void kmp()
{
    int  j=0,i=0;
     int ans=0;
     // get_next();
     while(i<len1)
     {
         if(j==-1||a[i]==b[j])
         {
             ++i;
             ++j;
         }
         else
            j=ne[j];
         if(j==len2)
         {

             j=ne[j];
               ans++;
         }
     }
     printf("%d\n",ans);
}
int main()
{
    scanf("%s %s",a,b);
    len1=strlen(a);    //主
    len2=strlen(b);     //子
    if(len2>len1)
        printf("0\n");
     get_next();
     kmp();
    return 0;
}

相關文章