原题链接
实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

  1. 示例 1:
  2. 输入: haystack = "hello", needle = "ll"
  3. 输出: 2
  4. 示例 2:
  5. 输入: haystack = "aaaaa", needle = "bba"
  6. 输出: -1

说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

代码 KMP

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(needle.empty()) return 0;
        auto matches = Math(haystack, needle);
        return matches.empty()? -1 : matches[0];
    }

    vector<int> Math(const string& s, const string& p){
        int n = s.size();
        int m = p.size();
        vector<int> nxt = Build(p);
        vector<int> ans;
        for(int i=0, j=0; i<n; i++){
            while(j>0 && s[i]!=p[j]){
                j = nxt[j];
            }
            if(s[i]==p[j]) j++;
            if(j == m){
                ans.push_back(i-m+1);
                j = nxt[j];
            }
        }
        return ans;
    }

    vector<int> Build(const string& p){
        int m = p.size();
        vector<int> nxt = {0, 0};
        for(int i=1, j=0; i<m; i++){
            while(j>0 && p[i]!=p[j]){
                j = nxt[j];
            }
            if(p[i]==p[j]) j++;
            nxt.push_back(j);
        }
        return nxt;
    }
};

image.png