题目:
如果一个字符串 S 恰好可以由某个字符串重复 K 次得到,我们就称 S 是 K 次重复字符串。
例如 “abcabcabc” 可以看作是 “abc” 重复 3 次得到,所以“abcabcabc” 是 3 次重复字符串。
现在给定一个字符串 S ,请你计算最少要修改其中几个字符,可以使 S 变为一个 K 次字符串?
示例:
输入:2 aabbaa;输出:2
代码:
package leetcode;
import java.util.Scanner;
public class StrChong {
public static void main(String[] args) {
/*
* 如果一个字符串 S 恰好可以由某个字符串重复 K 次得到,我们就称 S 是
* K 次重复字符串。例如 “abcabcabc” 可以看作是 “abc” 重复 3 次得到,所以
* “abcabcabc” 是 3 次重复字符串。
* 同理 “aaaaaa” 既是 2 次重复字符串、又是 3 次重复字符串和 6 次重复字符串。
* 现在给定一个字符串 S ,请你计算最少要修改其中几个字符,可以使 S 变为一个 K 次字符串?
*
* 示例:
* 输入:2 aabbaa
* 输出:2
* 解释:若字母序列为aab,要让它们一样,只需要将b改为a即可,即变化成aaa。
*
* 思路:只需要找到字符串中出现次数最多的字母,然后将剩下的字母变为该字母,即为操作次数最少
* */
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数K:");
int k = sc.nextInt();
System.out.println("请输入一个只包含小写字母的字符串s: ");
String str = sc.next();
int len = str.length();
// 如果字符串不是K的整数倍,就直接返回-1
if(len % k != 0){
System.out.println(-1);
return;
}
int minChange = 0; // 需要修改的最小次数
int patLen = len / k;
// 遍历每个子串
for (int i = 0; i < patLen; i++) {
// 创建数组记录每个字符出现的次数
int[] count = new int[26];
// 遍历每个子串的第i个字符
for(int j = i; j < len; j=j+patLen){
// 记录i出现的次数
count[str.charAt(j) - 'a']++;
}
// 找出出现次数最多的字符
int max = 0;
for (int fre : count) {
max = Math.max(max,fre);
}
// 需要修改的次数 k减去出现次数最多的字符的次数
minChange = minChange + (k - max);
}
System.out.println(minChange);
}
}