我是靠谱客的博主 小巧耳机,最近开发中收集的这篇文章主要介绍[kmp]leetcode28:实现 strStr() (easy),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:
在这里插入图片描述


题解:

思路:严蔚敏版 kmp 算法实现


class Solution {
public:
    int strStr(const string& s, const string& p) {
        int n=s.size(),m=p.size();
        int i=0,j=0;
        auto next=get_next(p);
        while(i<n){
            if(j==-1||s[i]==p[j])++i,++j;
            else j=next[j];
            if(j==m)return i-m;
        }
        return -1;
    }

    // 严版kmp算法实现:next[j]=k-1 相同前缀和后缀的最长长度为 k-1,不匹配时指针 j 回退到 next[j] 的位置,也就是位置 k
    // next[j]是不包括p[j]的相同前缀和后缀的长度,因此每次匹配失败后,都会回退到相同前缀的下一个位置与s[i]继续进行匹配。
    vector<int> get_next(const string& p){
        int m=p.size();
        // 由于next[j]是不算p[j-1]这个后缀的,所以要计算p[m-1]这个后缀,需要使用next[m],这里数组大小要多一个。
        // next[0]=-1 是因为字符串 p 中的字符是从下标 0 开始的,其他无相同前缀和后缀长度的next值为0,表示重新从下标0开始进行匹配
        vector<int> next(m+1,-1);
        // 指针 j 指向后缀,指针 k 指向前缀
        int j=0,k=-1;
        while(j<m){
            // 匹配成功的话,next[j+1]=k+1,表示之前的p[0...k]与p[j-k...j]已经匹配成功,此时的将j移动到下一个位置j+1,指针k也移动下一个位置k+1,那么next[j+1]=k+1,为相同前缀和后缀的长度为k的下一个位置k+1
            // 当j=m-1时,会计算next[m]的值的
            if(k==-1||p[k]==p[j])next[++j]=++k;
            // 匹配失败,k指针回到相同前缀和长度的下一个位置
            // 若没有可以匹配的前缀和后缀,那么k最终会回到-1的位置
            else k=next[k];
        }
        return next;
    }
};

最后

以上就是小巧耳机为你收集整理的[kmp]leetcode28:实现 strStr() (easy)的全部内容,希望文章能够帮你解决[kmp]leetcode28:实现 strStr() (easy)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部