题意:
        给你一个文本串 T ,一个非空模板串 S ,问 S 在 T 中出现了多少次?

方法:
kmp

思路:
        kmp算法本质要求模式串的 next[ ]数组,next[ i ]表示模式串0 ~ i 的最长公共前后缀的长度。
        kmp算法对文本串不会回溯,只是通过next[ ]回溯模式串。
        
        核心思想:next[ ] 数组存储的最长公共前后缀长度,与在模式串中即将转跳的 下标 密切相关。

        首先,先根据模式串求得next[ ]数组;
        然后,利用next[ ] 遍历文本串,求得模式串在文本串中出现了几次。

KMP匹配过程:



class Solution {
public:
    int n1,n2;
    int next[500005];//存储最长公共前后缀的长度
    int kmp(string S, string T) {
        n1=S.size();
        n2=T.size();
        get_next(S);//获取模式串的next[]
        
        int res=0;
        int j=0;
        for(int i=0;i<n2;i++){//遍历文本串
            while(j>0&&T[i]!=S[j])
                j=next[j-1];
            if(T[i]==S[j])
                j++;
            if(j==n1){//如果模式串匹配结束,则出现次数+1
                res++;
                j=next[j-1];
            }
        }
        return res;
    }
    
    void get_next(string S){//获取模式串的next[]
        int j=0;
        next[0]=0;//初始化
        for(int i=1;i<n1;i++){//循环模式串
            while(j>0&&S[i]!=S[j]){
                j=next[j-1];
            }
            if(S[i]==S[j]){
                j++;
                next[i]=j;
            }
        }
    }
};


时间复杂度:
空间复杂度: