力扣28题实现strStr()(学习KMP)
首先为什么要将讲这道题呢,你可能会说class Solution {
public:
int strStr(string haystack, string needle) {
return haystack.find(needle);
}
};
这不就解决了吗。
但是我主要通过它来学习kmp算法。
当然上述解法干掉了大部分人
至于kmp算法添加链接描述
这个应该是比较清楚的一种了
class Solution {
public:
int strStr(string haystack, string needle) {
int hSize=haystack.size();
int nSize=needle.size();
if(nSize0){
return 0;
}
int *next=new int[nSize];
int i=0;int j=-1;//i遍历needle字符串;
next[0]=-1;
while(i<nSize-1){//防止溢出
if(j-1||needle[j]needle[i]){
j++;i++;next[i]=j;
}
else{
j=next[j];
}
}/*开始j-1;所以循环第一个条件句;将next[1]赋值为0;(然后若neeedle[1]==needle[0],继续下一次循环)。反之,将重新将j赋值为-1;继续跟着i索引的位置进行循环;
第一次若相等第二次循环时1.相等:next[2]=1;
*/
i = 0, j = 0;
while (i < hSize) {
if (j == -1 || haystack[i] == needle[j]) {
j++;
i++;
}
else {
j = next[j];//
}
if (j == nSize) {
delete[]next;
return (i - nSize);
}
}
delete[]next;
return -1;
}
};