LeetCode 28 实现 strStr()#
目录#
1. 题目描述#
1.1. Limit#
Time Limit: 2000 ms
Memory Limit: 131072 kB
1.2. Problem Description#
实现 strStr()
函数。
给定一个 haystack
字符串和一个 needle
字符串,在 haystack
字符串中找出 needle
字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1
。
1.3. Sample Input 1#
输入: haystack = "hello", needle = "ll"
输出: 2
1.4. Sample Output 1#
输入: haystack = "aaaaa", needle = "bba"
输出: -1
1.5. Notes#
当 needle
是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle
是空字符串时我们应当返回 0
。这与C语言的 strstr()
以及 Java的 indexOf()
定义相符。
1.7. Source#
2. 解读#
KMP算法
3. 代码#
const int MAXN = 1e5 + 1;
int Next[MAXN] = { 0 };
class Solution {
public:
int getNext(string p, int length)
{
// 预计算Next,用于在失配的情况下得到j回溯的位置
Next[0] = 0;
Next[1] = 0;
for (int i = 1; i < length; i++) {
int j = Next[i];
while (j && p[i] != p[j]) {
j = Next[j];
}
Next[i + 1] = (p[i] == p[j]) ? j + 1 : Next[j + 1];
}
return 0;
}
// 在str中找pattern
int kmp(string str, string pattern)
{
size_t slen = str.size();
size_t plen = pattern.size();
// 预计算Next[]数组
getNext(pattern, plen);
size_t j = 0;
// 匹配str和pattern的每个字符
for (size_t i = 0; i < slen; i++) {
// 失配了,用Next[]找j的回溯位置
while (j && str[i] != pattern[j]) {
j = Next[j];
}
// 当前位置的字符匹配,继续
if (str[i] == pattern[j]) {
j++;
}
// 完全匹配
if (j == plen && plen > 0) {
// 匹配的起点是 i + 1 - plen,末尾是i
//printf("at location = %lu, %c\n", i + 1 - plen, str[i + 1 - plen]);
return i + 1 - plen;
}
}
if(plen > 0){
return -1;
}else{
return 0;
}
}
int strStr(string haystack, string needle) {
return kmp(haystack, needle);
}
};
联系邮箱:curren_wong@163.com
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公众号:复杂网络与机器学习
欢迎关注/转载,有问题欢迎通过邮箱交流。