1. 程式人生 > >演算法競賽入門-週期串(Periodic Strings)

演算法競賽入門-週期串(Periodic Strings)

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

}