@[TOC](28. 实现 strStr())
- 题号:力扣028
- 知识点:KMP,字符串
- 目标完成度:65/150
- 总结
题干:
思路:
- 1.经典的KMP匹配。查找子串在主串中的位置。
- 2.next是前缀表:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀
- 3.首先通过get_next函数计算模式串(子串)的前缀表。
- 4.然后通过一个for循环遍历主串,如果主串中的元素与子串中的元素不相等,则子串位置根据前缀表回退。
- 5.如果主串中的元素与子串中的元素相等,则子串指针位置后移一个。
- 6.当子串的指针指到子串末尾时,则说明子串已经被完全匹配,返回这次匹配的开头位置即可。
class Solution {
public:
void get_next(int* next, const string& s){
int j = -1;
next[0] = j;
for (int i = 1; i<s.size(); i++){
while(j>=0 && s[i] != s[j+1]){
j = next[j];
}
if(s[i] == s[j+1]){
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
if (needle.size()==0){
return 0;
}
int next[needle.size()];
get_next(next, needle);
int j = -1;
for (int i = 0; i<haystack.size(); i++){
while(j>=0 && haystack[i] != needle[j+1]){
j = next[j];
}
if (haystack[i] == needle[j+1]){
j++;
}
if(j == (needle.size()-1)){
return (i-needle.size()+1);
}
}
return -1;
}
};