已解答
简单
相关标签
相关企业
给你两个字符串
haystack
和needle
,请你在haystack
字符串中找出needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果needle
不是haystack
的一部分,则返回-1
。示例 1:
输入:haystack = "sadbutsad", needle = "sad" 输出:0 解释:"sad" 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 ,所以返回 0 。示例 2:
输入:haystack = "leetcode", needle = "leeto" 输出:-1 解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。提示:
1 <= haystack.length, needle.length <= 104
haystack
和needle
仅由小写英文字符组成
学了kmp算法,但是具体的实现过程还是看了评论区才明白。大佬的代码总是简洁高效,同样的原理能有如此巧妙的实现方法。
int strStr(string haystack, string needle) {
int n = needle.size();
vector<int> nums, res;
nums.assign(n + 1, 0);
for (int i = 2, j = 0; i <= n; i++) {
j = nums[i - 1];
while (j > 0 && needle[j] != needle[i - 1]) j = nums[j];
if (needle[j] == needle[i - 1]) j++;
nums[i] = j;
}
for (int i = 0, j = 0; i < haystack.size(); i++) {
while (j > 0 && haystack[i] != needle[j]) j = nums[j];
if (needle[j] == haystack[i]) j++;
if (j == needle.size()) {
res.push_back(i - needle.size() + 1);
j = nums[j];
}
}
if (res.size() > 0) return res[0];
return -1;
}