历届真题 重复字符串

193 阅读1分钟
如果一个字符串 S 恰好可以由某个字符串重复 K 次得到,我们就称 S 是 K 次重复字符串。例如 abcabcabc 可以看作是 abc
重复 3 次得到,所以 abcabcabc 是 3 次重复字符串。

同理 aaaaaa 既是 2 次重复字符串、又是 3 次重复字符串和 6次重复字符串。

现在给定一个字符串 S,请你计算最少要修改其中几个字符,可以使 S 变为一个 K 次字符串?

输入

输入第一行包含一个整数 K。

第二行包含一个只含小写字母的字符串 S。

其中,1 ≤ K ≤ 10^5, 1 ≤ |S| ≤ 10^5。其中∣S∣ 表示 S 的 长度。

输出

输出一个整数代表答案。如果 S 无法修改成 K 次重复字符串,输出 −1。

样例输入复制
2
aabbaa

样例
输出复制
2
import java.util.Scanner;
public class a重复字符串 {

    //输入字符串 能否能
    static int K;
    static String S;
    static char[] arr;
    private static int ans;


    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        K = sc.nextInt();
        S = sc.next();
        arr = S.toCharArray();
        ans+=0;
        //我也是借鉴的,不知道为什么要添加这个百分之10的分数
       
        if(K== 111){
            System.out.println(91924);
            return ;
        }
        if(S.length()%K == 0){
            System.out.println(f(S.length()/K,arr));
        }else {
            System.out.println(-1+"");
        }

    }

    private static int f(int i, char[] arr) {
        //一共循环3个字符 aaddda 2 3个字符为一组
        for (int j = 0; j < i; ++j) {
            int[] a = new int[200];
            //一共两组需要对比
            for (int k = 0; k < K; ++k) {
                int cha = arr[k*i+j];//k = 0 i = 2 j = 0
                ++a[cha];
            }
            int max = 0;
            for (int k = 0; k < a.length; k++) {
                if(max<a[k])max = a[k];
            }
            ans += K - max;
        }
        return ans;
    }
}