KMP 算法

一. 问题: 查找匹配字符串

如从searchText = “fabfafabfab” 中找是否有匹配的字符串 pattern = “fabfab

二. 算法:

  Solution 1:  暴力求解,每次移

Solution 2: 快速移动

其中next数组中的值为当前字符前的字符串(preSub)的最长的相同前缀后缀的长度,

如pattern[5] = b.   preSub = fabfa.  fabfa 的最长相同前缀是 preSub[0,1] = fa, 后缀是preSub[4,5] = fa 

Solution3:优化的Solution2的Next数组

 

三. 代码

没有优化的求next数组代码:

    void GetNext(string &p, vector<int> & next)  
    {  
        int pLen = p.size();    
        int k = -1;  
        int j = 1;  
        while (j < pLen)  
        {  
            if (k > -1 )   
            {  
                if(p[j-1] == p[k]){
                 
                    next[j++] = ++k;  
                }
                else {
                     k = next[k];  
                }
            }  
            else   
            {  
               k = 0; 
               next[j++] = k;  
            }  
        }  
    }

 

四. 其图解释

1. 递归求解Next[j] 当 p[j] != p[k]时

2. 优化Next数组:

五. 参考: https://blog.csdn.net/v_JULY_v/article/details/7041827

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章