同一段字符重复出现组成的字符串,求段长度和重复次数

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

}
posted @   fighterk  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示