代码随想录:实现strStr()

代码随想录:实现strStr()

即kmp

这道题卡了我几天,因为难度太大经常没勇气写题。

kmp的原理我是明白的,问题是代码实现求next数组的时候,不同于手算可以轻松看出来最长公共前缀后缀,采用了用kmp算法来求next数组,也就是把前缀和后缀当成了两个字符串,求最长公共长度,如果匹配,则j+1,如果不匹配,则通过next数组上一位跳到上一个可能能匹配的地方。

代码跟着敲了一遍,还没完全懂,希望下次再见的时候能轻松拿下

class Solution {
public:
    int strStr(string haystack, string needle) {
        if (needle.size() == 0) {
            return 0;
        }
        vector<int> next(needle.size());
        getNext(next, needle);
        int j = 0;
        for (int i = 0; i < haystack.size(); i++) {
            while (j > 0 && needle[j] != haystack[i]) {
                j = next[j-1];
            }
            if (haystack[i] == needle[j]) {
                j++;
            }
            if (j == needle.size()) {
                return i - needle.size() + 1;
            }
        }
        return -1;
    }

    void getNext(vector<int>& next, string s) {
        int j = 0;
        int i = 1;
        next[0] = 0;
        for (; i < s.size(); i++) {
            while (j > 0 && s[i] != s[j]) {
                j = next[j - 1]; // 循环到相等为止
            }
            if (s[i] == s[j]) {
                j++;
            }
            next[i] = j;
        }
    }
};
posted @ 2024-12-08 21:56  huigugu  阅读(3)  评论(0编辑  收藏  举报