演算法競賽入門-週期串(Periodic Strings)
阿新 • • 發佈:2019-02-02
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; } }