Description
Given two strings needle
and haystack
, return the index of the first occurrence of needle
in haystack
, or -1
if needle
is not part of haystack
.
Example 1:
Input: haystack = “sadbutsad”, needle = “sad” Output: 0 Explanation: “sad” occurs at index 0 and 6. The first occurrence is at index 0, so we return 0.
Example 2:
Input: haystack = “leetcode”, needle = “leeto” Output: -1 Explanation: “leeto” did not occur in “leetcode”, so we return -1.
Constraints:
1 <= haystack.length, needle.length <= 104
haystack
andneedle
consist of only lowercase English characters.
Code
Time Complexity: , Space Complexity:
標準 KMP algorithm。
class Solution {
public:
int strStr(string haystack, string needle) {
int n = needle.length();
vector<int> lps(n, 0);
// build lps
int len = 0;
for(int i = 1; i < n;) {
if(needle[i] == needle[len]) {
lps[i++] = ++len;
} else {
if(len == 0) {
i++;
} else {
len = lps[len - 1];
}
}
}
// kmp algorithm
int m = haystack.length();
int i = 0, j = 0;
while(i < m) {
if(haystack[i] == needle[j]) {
i++;
j++;
if(j == n) return i - j;
} else {
if(j == 0) i++;
else {
j = lps[j - 1];
}
}
}
return -1;
}
};