【蓝桥云课】周期串

题目:求字符串的最小周期(三种解法)

程序代码:

import java.util.Scanner;

public class PeriodicStrings {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			String words = sc.nextLine();
			f1(words);
			f2(words);
			f3(words);
		}
	}
	
	//采用数学的方法,判断s[j]==s[j%T]
	public static void f1(String s) {
		char[] c_s = s.toCharArray();//转成字符数组
		boolean isok = true;
		int t = 1;
		for(t=1;t<=c_s.length;t++) {
			if(c_s.length%t==0) {//周期串c_s的长度是周期t的倍数
				isok = true;//假定当前周期t是最小周期
				for(int start=t;start<c_s.length;start++) {
					if(c_s[start]!=c_s[start%t]) {
						isok = false;
						break;
					}
				}
				if(isok==true) {//假设周期为t全部检测完成
					break;
				}
			}
		}
		System.out.println(t);
	}
	
	//采用长度扩展两倍进行字符比较的方法
	public static void f2(String s) {
		String s2 = s+s;//扩展到两倍,方便取长度为s.length()子串
		int t=1;//不能从0开始
		for(t=1;t<=s.length();t++) {
			if(s.length()%t!=0) continue;
			String s3 = s2.substring(t,t+s.length());
			if(s3.equals(s)) break;
		}
		System.out.println(t);
	}

	//采用空字符替换的方法
	public static void f3(String s) {
		int t = 1;
		for(t=1;t<=s.length();t++) {
			if(s.length()%t==0) {
				String sub = s.substring(0,t);
				if(s.replace(sub, "").length()==0) {
					System.out.println(t);
					break;
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CS_木成河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值