码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2019-06-06 19:13:35      阅读:160      评论:0      收藏:0      [点我收藏+]

标签: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<int> next;
    void ComputeNext(const string& p){
        int n = p.size();
        next.resize(n);
        
        int k = -1;
        next[0] = k;
        for(int i = 1; i < n; i++){
            while(k > -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 < t.size(); i++){
            while(k > -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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!