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().
Companies:
Amazon, Microsoft, Bloomberg, Facebook, Apple
// OJ: https://leetcode.com/problems/implement-strstr/
// Author: github.com/lzl124631x
// Time: O(MN)
// Space: O(1)
class Solution {
public:
int strStr(string haystack, string needle) {
if (needle.size() > haystack.size()) return -1;
for (int i = 0; i <= haystack.size() - needle.size(); ++i) {
int j = 0;
for (; j < needle.size() && haystack[i + j] == needle[j]; ++j);
if (j == needle.size()) return i;
}
return -1;
}
};
// OJ: https://leetcode.com/problems/implement-strstr/
// Author: github.com/lzl124631x
// Time: average O(S+T), worst O(ST)
// Space: O(1)
class Solution {
typedef long long LL;
public:
int strStr(string s, string t) {
int S = s.size(), T = t.size(), d = 128;
if (!S || !T || T > S) return T ? -1 : 0;
LL m = 1e9+7, p = 1, hs = s[0], ht = t[0];
for (int i = 1; i < T; ++i) {
p = (p * d) % m; // we need d^(T-1)
ht = (ht * d + t[i]) % m;
hs = (hs * d + s[i]) % m;
}
for (int i = 0; i <= S - T; ++i) { // Loop for each start/pop point
if (hs == ht) { // in case of collision, check the equity.
int j = 0;
for (; j < T && s[i + j] == t[j]; ++j);
if (j == T) return i;
}
if (i < S - T) hs = ((hs - s[i] * p) * d + s[i + T]) % m;
if (hs < 0) hs += m; // we might get negative hs, converting it to positive
}
return -1;
}
};
See KMP Algorithm
// OJ: https://leetcode.com/problems/implement-strstr/
// Author: github.com/lzl124631x
// Time: O(M+N)
// Space: O(N)
class Solution {
vector<int> getLps(string &s) {
int N = s.size(), j = 0;
vector<int> lps(N);
for (int i = 1; i < N; ++i) {
while (j > 0 && s[i] != s[j]) j = lps[j - 1];
j += s[i] == s[j];
lps[i] = j;
}
return lps;
}
public:
int strStr(string s, string t) {
if (t.empty()) return 0;
int M = s.size(), N = t.size(), i = 0, j = 0;
auto lps = getLps(t);
while (i < M) {
if (s[i] == t[j]) {
++i;
++j;
}
if (j == N) return i - j;
if (i < M && s[i] != t[j]) {
if (j) j = lps[j - 1];
else ++i;
}
}
return -1;
}
};
Or
// OJ: https://leetcode.com/problems/implement-strstr/
// Author: github.com/lzl124631x
// Time: O(M+N)
// Space: O(N)
class Solution {
vector<int> getLps(string &s) {
int N = s.size(), j = -1;
vector<int> lps(N + 1, -1);
for (int i = 1; i <= N; ++i) {
while (j >= 0 && s[i - 1] != s[j]) j = lps[j];
lps[i] = ++j;
}
return lps;
}
public:
int strStr(string s, string t) {
if (t.empty()) return 0;
int M = s.size(), N = t.size(), i = 0, j = 0;
auto lps = getLps(t);
while (i < M) {
if (s[i] == t[j]) {
++i;
++j;
}
if (j == N) return i - j;
if (i < M && s[i] != t[j]) {
if (j) j = lps[j];
else ++i;
}
}
return -1;
}
};