同一段字元重複出現組成的字串,求段長度和重複次數
阿新 • • 發佈:2022-05-05
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); }
}