KMP算法
标签:com 就是 ring solution 思路 数组 put 包括 前缀
KMP基本思路很简单,关键在于求失配数组,也就是next数组
next[k]表示[0, k]的最长真前缀后缀的索引(不包括p[0, k])
假设我们现在有了p[0,i-1]的最长真前缀后缀索引为k,如何求p[0, i]的最长真前缀后缀呢?
- p[i] == p[k+1], 那么很显然next[i] = k+1
- p[i] != p[k+1], 那么需要减小k,由于已知p[i] 和 p[k], k = next[k]
28. Implement strStr()
class Solution {
private:
vector next;
void ComputeNext(const string& p){
int n = p.size();
next.resize(n);
int k = -1;
next[0] = k;
for(int i = 1; i -1 && p[k+1] != p[i]){
k = next[k];
}
if(p[k+1] == p[i]) k++;
next[i] = k;
}
}
int KMP(const string &t, const string &p){
ComputeNext(p);
int k = -1;
for(int i = 0; i -1 && p[k+1] != t[i]){
k = next[k];
}
if(p[k+1] == t[i]) k++;
if(k == p.size() - 1) return i - p.size() + 1;
}
return -1;
}
public:
int strStr(string haystack, string needle) {
return needle == "" ? 0 : KMP(haystack, needle);
}
};
KMP算法
标签:com 就是 ring solution 思路 数组 put 包括 前缀
原文地址:https://www.cnblogs.com/qbits/p/10986489.html
文章来自:
搜素材网的
编程语言模块,转载请注明文章出处。
文章标题:
KMP算法
文章链接:http://soscw.com/essay/23151.html
评论