开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
1.描述
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = "hello", needle = "ll"
输出:2
示例 2:
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3:
输入:haystack = "", needle = ""
输出:0
提示:
- 1 <= haystack.length, needle.length <= 10^4
- haystack 和 needle 仅由小写英文字符组成
2.分析
这里强调两个关键点:
这里next数组保存的是以各下标为终止的字符串,对应的最长相等前后缀的长度。
求解next数组的步骤:
- 先处理不相等的情况,找到确定的slow;
- 下标判等,实际长度加一;
- next赋值。
3.AC代码
class Solution {
public:
void getnext(string s,int* next){ //next数组记录以i为结尾的字符串的最长相等前后缀的长度
int slow=0;//slow既代表前缀末尾,也代表最长相等前后缀长度
next[0]=0;
for(int fast=1;fast<s.size();fast++){
while(slow>0&&s[slow]!=s[fast]) slow=next[slow-1]; //先处理不相等的情况,找到确定的slow
if(s[slow]==s[fast]) slow++; //下标判等,实际长度加一
next[fast]=slow; //赋值
}
return;
}
int strStr(string haystack, string needle) {
if(needle.size()==0) return 0;
int next[needle.size()];
getnext(needle,next);
int i=0;
for(int j=0;j<haystack.size();j++){ //循环内也可以采用处理不相等,判等的步骤,代码更简洁
if(haystack[j]==needle[i]){ //如果此位置两者相等
if(i==needle.size()-1) return j-needle.size()+1; //判断是否已经到模式串末尾了
i++;continue;
}
while(i>0&&needle[i]!=haystack[j]) i=next[i-1]; //如果此位置两者不相等
if(needle[i]==haystack[j]) i++; //如果通过next数组匹配到了(两者在这一位置相等),i进入下一位置
}
return -1;
}
};