题解 | #kmp算法#

kmp算法

https://www.nowcoder.com/practice/bb1615c381cc4237919d1aa448083bcc

//时间复杂度O(m+n),对解题思路感兴趣的朋友可以查看我的专栏"KMP算法的数学原理(优化版)"
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算模板串S在文本串T中出现了多少次
     * @param S string字符串 模板串
     * @param T string字符串 文本串
     * @return int整型
     */
    void compute_next(string_view s,int *next){
        int m=s.size(),k=0;
        next[0]=0;
        for(int i=1;i<m;++i){
            next[i]=k;
            while(k>0 && s[i]!=s[k]){
                k=next[k];
            }
            if(s[i]==s[k])
                ++k;
        }
    }
    int kmp(string S, string T) {
        int m=S.size();
        int n=T.size();
        int next[m];
        compute_next(S, next);
        int count{0};
        for(int i=0,j=0;j<n;++j){
            while(i>0 && S[i]!=T[j]){
                i=next[i];
            }
            if(S[i]==T[j]){
                ++i;
            }
            if(i==m){
                while(i>0){
                    i=next[i-1];
                    if(S[i]==T[j]){
                        ++i;
                        break;
                    }
                }
                ++count;
            }
        }
        return count;
    }
};

全部评论

相关推荐

水墨不写bug:疑似没有上过大学
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务