周期字串

问题描述
  右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有座山……”这样循环的故事来搪塞右右。
  我们定义,如果一个字符串是以一个或者一个以上的长度为k的重复字符串所连接成的,那么这个字符串就叫做周期为k的串。
  例如:
  字符串’abcabcabcabc’周期为3,因为它是由4个循环’abc’组成的。它同样是以6为周期(两个重复的’abcabc’)和以12为周期(一个循环’abcabcabcabc’)。
  右右现在想给他的朋友大灰狼转述妈妈讲的故事,请帮他写一个程序,可以测定一个字符串的最小周期。
输入格式
  一个最大长度为100的无空格的字符串。
输出格式
  一个整数,表示输入的字符串的最小周期。
样例输入
HaHaHa
样例输出
2
样例输入
Return0
样例输出
7
 
import java.util.Scanner;

public class Main2 {
    
    public void printResult1(String A) {
        char[] arrayA = A.toCharArray();
        int max = arrayA.length;
        for(int i = 0;i < arrayA.length;i++) {
            int k = i + 1;//k为模式串的长度
            if(k > arrayA.length / 2)
                break;
            else if(arrayA.length % k != 0)
                continue;
            int j = k;
            for(;j < arrayA.length;j++) {
                if(arrayA[j] != arrayA[j % k])//这是核心
                    break;
            }
            if(j == arrayA.length) {
                max = k;//k为当前符合条件的模式串的长度
                break;
            }
        }
        System.out.println(max);
        return;
    }
    
    public static void main(String[] args) {
        Main2 test = new Main2();    
        Scanner in = new Scanner(System.in);
        String A = in.next();
        test.printResult1(A);
    }
}

【分析】给定一个长度不超过80的字符串s,假如这个字符串的长度是L,我们现在的任务是找到满足条件的k,那么k必定能被L整除,并且我们能够分析出k的取值范围,1<=k<L,当我们找到k时,s[i] == s[i%k],这个规律是解决此题的一个关键所在,例如abcabcabcabc,这里一定有s[i] == s[i%3],大家可以代入试试看0 1 2    3 4 5    6 7 8    9 10 11。

 
posted @ 2018-04-16 20:15  Wbin_01  阅读(195)  评论(0)    收藏  举报