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

 

 

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