Implement strStr()

Jin Shang bio photo By Jin Shang

Implement strStr().

Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Example 1:

Input: haystack = "hello", needle = "ll"
Output: 2

Example 2:

Input: haystack = "aaaaa", needle = "bba"
Output: -1

Clarification:

What should we return when needle is an empty string? This is a great question to ask during an interview.

For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C’s strstr() and Java’s indexOf().

Solution:

KMP

class Solution {
public:
    vector<int> LPS(string pat){
        vector<int> lps(pat.size(), 0);
        for(int i = 1, len = 0; i < pat.size();){
            if(pat[i] == pat[len]){
                lps[i++] = ++len;
            }else if(len){
                len = lps[len-1];
            }else{
                lps[i++] = 0;
            }
        }
        return lps;
    }
    int strStr(string txt, string pat) {
        if(pat.empty()) return 0;
        vector<int> lps = LPS(pat);
        for(int i = 0, j = 0; i < txt.size();){
            if(txt[i] == pat[j]){
                i++; j++;
            }
            if(j==pat.size()){// found match
                j = lps[j-1];
                return i-pat.size();
            }
            else if(i < txt.size() && txt[i] != pat[j]){
                j ? j = lps[j-1] : i++;
            }
            
        }
        return -1;
    }
};