求周期字符串的最小子串

示例:输入abcabcabc,此时最小的子串是abc,长度为3,输出3.
直接给出代码进行讲解

import java.util.Scanner;
public class minstring {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		String content=in.next();
		int length=content.length();
		boolean judge=false;
		//字符串转换为字符数组
		char[] test=content.toCharArray();
		for(int i=1;i<length;i++) {
			int ok=1;
			for(int j=i;j<length;j++) {
				if(test[j]!=test[j%i]) {ok=0;break;}
			}
			if(ok==1) {	System.out.println(i); judge=true;break;}
		}
		if(!judge) {System.out.println(length);}
	}

}

思考:因为要求出最小的子串,那么最小就可能是1,然后再逐渐增大测试。由此考虑使用一个变量来记录字串长度(即代码中的i从1测试到length-1)。
然后对代码块关于j的for循环原理:

			for(int j=i;j<length;j++) {
				if(test[j]!=test[j%i]) {ok=0;break;}
			}

用上面数组[a,b,c,a,b,c,a,b,c]来讲解:

j%i的目的在于使得始终在子串长度0-i-1进行遍历
[a(0), b(1), c(2)
a(3,3%3=0),b(4,4%3=1),c(5,5%3=2)
a(6,6%3=0),b(7,7%3=1),c(8,8%3=2)]

当i=1时相当于此时考虑子串是[a]。循环j=1,j%i=0,test[1]!=test[0]成立,则不正确。
i=2同理
i=3时,考虑子串是[a,b,c].循环j=3,j%3=0,test[3]=test[0];j=4,j%3=1,test[4]=test[1]…j=8,test[8]=test[2]此时遍历完了字符串,所以最小子串是[a,b,c]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

帅逼码农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值