求最長公共前綴和後綴—基於KMP的next數組

KMP算法最主要的就是計算next[]算法,但是我們知道next[]求的是當前字符串之前的子字符串的最大前後綴數,但是有的時候我們需要比較字符串中前後綴最大數,比如

LeetCode的shortest Palindrome 就是基於KMP算法求最短子字符串。

public static int[] longestPS(String s) {
		int sLen = s.length();
		char[] p = s.toCharArray();
		//存放最大前綴後綴數
		int[] lNext = new int[sLen];
		//最大前後綴數(前綴指針)
		int k = 0;
		//後綴指針
		int j = 1;
		
        while(j < sLen) {
            if(p[k] == p[j]) {
            	//相等則將前一次比較的結果加上這次:k+1;然後繼續加1比較。
            	lNext[j] = k + 1;
                k++;  j++;
            } else {
            	//如果p[k] != p[j]則k是不是在初始位置,是的話,K不變,後綴指針加1;
                if(k == 0) {
                	j++;
                } else { 
                	//k不爲0,說明指針不在初始位置。根據lNext數組,找到上一個最大前後綴數的位置,繼續判斷。
                	k = lNext[k-1];
                }
            }
        }
        
        return lNext;
	}
/*
 * 舉例:字符串 ABDABCE 
 * 對應的lNext == {0,0,0,1,2,0,0};
 * 
 */

下面是KMP的next數組代碼,用以比較。

public void GetNext(char* p,int next[]) {  
	int pLen = strlen(p);  
	next[0] = -1;  
	int k = -1;  
	int j = 0;  
	while (j < pLen - 1)  {   
	   if (k == -1 || p[j] == p[k]) {  
           ++k;  
           ++j;  
           next[j] = k;  
        } else {  
            k = next[k];  
          }  
   }  
} 
如果想要更詳細的學習KMP算法,建議請移步此篇博客,從頭到尾徹底理解KMP,這是我學習中收收穫最多的。

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