KMP算法,关键在于求next数组,求next数组搞了好久都没搞懂,干脆记住算了。。。吧

//
// Created by jt on 2020/8/14.
//
#include <string>
using namespace std;

class Solution {
public:
    char *strStr(char *haystack, char *needle) {
        int size1 = strlen(haystack), size2 = strlen(needle);
        if (size2 == 0) return haystack;
        int next[size2], i = 0, j = 0;
        getNext(needle, next, size2);
        while(i < size1 && j < size2) {
            if (j == -1 || haystack[i] == needle[j]) {
                ++i;
                ++j;
            } else {
                j = next[j];
            }
        }
        if (j == size2) return haystack + i - j;
        else return nullptr;
    }

    void getNext(char *a, int *next, int size) {
        int i = 0, j = -1;      // i指向尾子串尾部,j指向头子串尾部
        next[0] = -1;
        while (i < size) {
            if (j == -1 || a[i] == a[j]) {
                if (a[++i] == a[++j]) next[i] = next[j];
                else next[i] = j;
            } else j = next[j];
        }
    }
};