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);
}
}