算法竞赛入门-周期串(Periodic Strings)

13 篇文章 0 订阅
11 篇文章 2 订阅

1. 题目

今天第三道

如果一个字符可以由某个长度为k的字符串重复多次得到,则称该字符串以k为周期。例如,abcabcabc以3为周期(注意,他也以6和12为周期)。

样例输入

1

hohoho

样例输出

2


2. 思路

第一种:使用String类的replaceAll方法

第二种:使用间隔循环,因为长度必须要能够被间隔整除


3. 代码

package basic.第三章;

import java.util.Scanner;

/**
 * 周期串(PeriodicStrings)
 * 题目:如果一个字符可以由某个长度为k的字符串重复多次得到,则称该字符串以k为周期。例如,abcabcabcabc以3为周期(注意,他也以6和12为周期)。
 * input
 * 1
 * hohoho
 * output
 * 2
 * 思路: 第一种:使用String类的replace方法,第二种,使用间隔进行匹配
 * Created by Administrator on 2018/4/8.
 *
 * @author 春风吹又生
 */
public class PeriodicStrings {
    static int length;
    static String str;

    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);
        int n = read.nextInt();
        read.nextLine();

        while (n-- > 0) {
            // 获取当前序列
            str = read.next();

            // 遍历获取
            length = str.length();
            int i;
            for (i = 1; i < length; i++) {
                String original = str;
                String replace = str.substring(0, i);
                String replaceStr = original.replaceAll(replace, "");
                if (replaceStr.equals("")) break;
            }

            System.out.println(i);

            int k = 0;
            int j;
            for (j = 1; j < length; j++) { // 遍历间隔
                if (length % j == 0) { //说明这个间隔能够被整除
                    if (check(k, j)) {
                        break;
                    }
                }
            }
            System.out.println(j);
        }
    }

    // 第二种方式
    public static boolean check(int k, int i) {
        char[] chs = str.toCharArray();

        for (int j = 0; j < length; j++) { // 从当前数字加间隔 进行匹配字母,如果不等直接return false
            if (chs[(j + k) % length] != chs[(i + j) % length]) {
                return false;
            }
        }
        return true;
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值