在一行上输入一个长度为
且为偶数,仅由小写字母构成的字符串
,代表待修改的字符串。
输出一个整数,表示将
修改为双生串的最小修改次数。
popipa
3
在这个样例中,将
修改为
是其中一个最优解。
aaaa
0
在这个样例中,给定的字符串已经是双生串,不需要修改。
import java.util.*;
public class Main {
// 本质上就是用前半段/后半段的总长度减去出现次数最多的字符的数量
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine();
String first = input.substring(0, input.length() / 2);
String last = input.substring(input.length() / 2);
Map<Character, Integer> firstMap = getMap(first);
Map<Character, Integer> lastMap = getMap(last);
int times = getCount(firstMap) + getCount(lastMap);
System.out.print(times);
}
private static Map<Character, Integer> getMap(String str) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
return map;
}
private static int getCount(Map<Character, Integer> map) {
if (map.size() == 1) { // 代表只有一种字母,不需要修改
return 0;
}
int maxValue = 0; // 获取到出现次数最多的字符串
int length = 0;
for (char key : map.keySet()) {
int value = map.get(key);
length += value;
if (value > maxValue) {
maxValue = value;
}
}
// 用总长度减去最多的字符串数量
return length - maxValue;
}
} java实现,注意题目描述是前半部分都一样,后半部分都一样,左右两部分长度必须相等!用left和right数组分别统计左半部分的各元素出现次数和右半部分各元素出现次数,为了让左半部分都是一个字母,需要修改次数为左半部分的长度 - 左半部分统计的最大次数。同理,右半部分也是一样,最后把两者相加即可得到结果7.19
import java.util.Scanner;
import java.util.Arrays;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String s = in.nextLine();
int mid = s.length() / 2 - 1;
int[] left = new int[26];
int[] right = new int[26];
for (int i = 0; i <= mid; i++){
left[s.charAt(i) - 'a']++;
right[s.charAt(i + mid + 1) - 'a']++;
}
Arrays.sort(left);
Arrays.sort(right);
System.out.println((mid + 1 - left[25]) + (mid + 1 - right[25]));
}
}
}