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;
}
};