1. 程式人生 > 其它 >同一段字元重複出現組成的字串,求段長度和重複次數

同一段字元重複出現組成的字串,求段長度和重複次數

package demo2;

public class P88 {
//同一段字元重複出現組成的字串,求段長度和重複次數
//失配位置i就是檢查範圍的後一位,跳轉位置k就是最後一段的首位,(i-k)也就是段長度
public static void main(String[] args) {
String str="aabaabaabaab";
repeatTimes(str);
}

static int[] next(String p) {
	int pLen=p.length();
	int[] next=new int[pLen+1];		//此處末位也是重複的一部分,故多求一位,下面while同理
	char[] pArr=p.toCharArray();
	
	next[0]=-1;		//-1是為了處理這一要i++的特殊情況
	if(pLen==1)
		return next;
	next[1]=0;
	
	int j=1;		//遞推法,求之後的next[]
	//原理:next[j]等於k,就是j處失配後有k長度的公共前後綴。
	int k=next[j];
	while(j<pLen) {
	//若j、k的字元相同,則(j+1)處失配的公共前後綴為k+1
		if(k<0 || pArr[j]==pArr[k]) {
			next[++j]=++k;
		}
	//若不同,則next[j]的值k不可用,繼續找相同字元
		else {
			k=next[k];
		}
	}
	return next;
}

static void repeatTimes(String str) {		//求重複次數
	int[] next=next(str);
	int k=next[next.length-1];
	int len=str.length()-k;
	System.out.println("段長度為"+len+",重複次數為"+str.length()/len);
	
}

}