1、问题描述
【问题描述】
如果一个字符串 S怡好可以由某个字符串重复人次得到,我们就称 S是
人 次重复字符串。例如“abcabcaibc”可以看作是“abc” 重复3次得到,所以
wabcabcaibc” 是3次重复字符串。
同理“aaaaaa”既是2次重复字符串、又是了次重复字符串和6 次重复字
符串。
现在给定一个字符串 S,请你计算最少要修改其中几个字符,可以使S变
为一个K 次字符串?
【输入格式】
输入第一行包含一个整数人。
第二行包含一个只含小写字母的字符串 S。
【输出格式】
输出一个整数代表答案。如果 S无法修改成人 次重复字符串,输出 -1。
【样例输入】
2
aabbaa
【样例输出】
2
2、代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
String s = scanner.next();
//如果字符串不能成功把每一份分为k个,那就不能成为重复字符串
if(s.length() % k != 0) {
System.out.println(-1);
}else {
update(s,k);
}
}
public static void update(String s,int k) {
int ans = 0;
int len = s.length();
//每一组的长度
int group = len / k;
//26个小写字母的个数
int[] letter = new int[26];
//遍历每一组的第i+1个字符,找出最多的,用这些字符的和减去最大值就是需要修改个数
for(int i = 0;i < group;i++) {
int sum = 0;
int max = 0;
//清零
for(int j = 0;j < 26;j++) {
letter[j] = 0;
}
//找到每一组的各个字符的个数
for(int j = i;j < len;j += group) {
letter[s.charAt(j) - 97]++;
}
//找出最多的那个
for(int j = 0;j < 26;j++) {
if(letter[j] > max) {
max = letter[j];
}
sum += letter[j];
}
ans += (sum - max);
}
System.out.println(ans);
}
}