1.题目
【问题描述】
如果一个字符串S恰好可以由某个字符串重复K次得到,我们就称S是K次重复字符串。例如"abcabcabc”可以看作是"abc”重复3次得到,所以
"abcabcabc”是3次重复字符串。
同理"aaaaaa"既是2次重复字符串、又是3次重复字符串和6次重复字符串。
现在给定一个字符串S,请你计算最少要修改其中几个字符,可以使S变为一个K次字符串?
【输入格式】
输入第一行包含一个整数K。
第二行包含一个只含小写字母的字符串S。
【输出格式】
输出一个整数代表答案。如果S无法修改成K次重复字符串,输出-1。
【样例输入】
2
aabbaa
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,$1 \leq K \leq 100000,1 \leq |S| \leq 100000$。其中$|S|$表示$S$的长度。
2. 题解
2.1 思路分析
先判断字符串长度是否是K的整数倍,不是则输出-1
若是,则将字符串分为K组,对每组的第i位统计得到各字符出现次数的最大值maxAppear
则要想将该字符串变为重复字符串在第i位上需要修改的最少的次数为K-maxAppear
对每一位需要做的最小修改进行求和即可得到最终的结果
2.2 代码实现
import java.util.*;
public class Main {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int K = scanner.nextInt();
String str = scanner.next();
int len = str.length();
char[] strChars = str.toCharArray();
if(len%K!=0){
System.out.println(-1);
}else {
int minChange = 0;
int groupLen = len/K;
for (int i = 0; i < groupLen; i++) {//将字符串分成K组
// 统计每组字符串第j位的哪个字符出现的次数最多得到次数
int maxAppear = 0;
int[] charCounter = new int[26];
for (int j = 0; j < 26; j++) {
charCounter[j]=0;
}
for (int j = 0; j < K; j++) {
int tmpIndex = (int)(strChars[j*groupLen+i]-'a');
charCounter[tmpIndex] += 1;
}
for (int j = 0; j < 26; j++) {
maxAppear = Math.max(maxAppear,charCounter[j]);
}
minChange += (K-maxAppear);
}
System.out.println(minChange);
}
}
}
2.3 提交结果
1 | 正确 | 10.00 | 62ms | 22.22MB | 输入 输出 |
---|---|---|---|---|---|
2 | 正确 | 10.00 | 93ms | 22.30MB | VIP特权 |
3 | 正确 | 10.00 | 109ms | 22.30MB | VIP特权 |
4 | 正确 | 10.00 | 93ms | 22.26MB | VIP特权 |
5 | 正确 | 10.00 | 109ms | 22.23MB | VIP特权 |
6 | 正确 | 10.00 | 78ms | 22.29MB | VIP特权 |
7 | 正确 | 10.00 | 140ms | 22.99MB | VIP特权 |
8 | 正确 | 10.00 | 171ms | 25.62MB | VIP特权 |
9 | 正确 | 10.00 | 125ms | 25.64MB | VIP特权 |
10 | 错误 | 0.00 | 125ms | 24.57MB | VIP特权 |
暂未看出错在哪了
评论 (0)