KMP算法-next數組的應用-循環節問題

先來個next數組模板

void Next()
{
	int i=0,j=-1;
	next[0]=-1;
	while(i<len)
	{
		if(s[i]==s[j]||j==-1)
			next[++i]=++j;
		else
			j=next[j];
	}
}

首先

1:i-next[i]是最小循環節的長度 
2:字符串的循環條件是i%(i-next[i])==0&&next[i]!=0 
3:最小循環節的循環次數是i / (i-next[i])

4:整體 在  字符串 s

      L= strlen(s)
      n = next[l]

      L%(L-next[L])==0                     有循環節

      k = L - n= L - next[L]                 最小循環節 

1>  p = L%k=L%(L-next[L])            循環k節點若干次後剩餘部分的長度  
 2> q = (k-p)%k =k-q                       q爲字符串s1要想補齊成恰好整數個k所需要的最少字符數 


對於1  ababa  沒有循環節  next[L]=3  最小循環節L-next[L]=2  則 取餘說明 還剩多少節點沒有循環  如最後一個a

正對2如果最小循環節減去取餘後的   則得到補齊整數時所需的字串


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