1.字符串操作
给定一个只包含小写字母字符串,每次可以选择两个相同的字符删除,并在字符串结尾新增任意一个小写字母。
请问最少多少次操作后,所有的字母都不相同?
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
示例1
输入例子:"abab"
输出例子:2
例子说明:第一次操作将两个'a'变成一个'f',字符串变成"bbf"。
第二次操作将两个'b'变成一个'b',字符串变成"fb"。
操作方式不是唯一的,但可以证明,最少操作次数为2。
解题思路:
由于只包含小写字母,并且经过操作后要求每个字母最多为一个,可以用一个map集合来存放所有的小写字母并且记录个数,26个字母作为key,每个字母的个数作为value,初始化value的值为0。
遍历给出的字符串,取到各个字母的个数,存放在集合中。
遍历集合,如果某个key(记为a)对应的值大于等于2就说明需要操作该值,
- 再遍历集合如果集合中有key(记为b)对应的值为0,就让两个a变为一个b,此时需要把a的值减2、b的值加1,操作次数加一,内层遍历结束
- 如果集合中没有值为0的key,两个a就变为一个a,操作次数加一
public static void main(String[] agrs) {
Scanner scanner=new Scanner(System.in);
String str=scanner.next();
Map<Character, Integer> map = new HashMap<>();
for (char i = 'a'; i <= 'z'; i++) {
map.put(i, 0);
}
for (int i = 0; i < str.length(); i++) { //遍历字符串,把所有的字符存放在map中,并记录个数
if (map.containsKey(str.charAt(i))) {
int value = map.get(str.charAt(i));
map.put(str.charAt(i), value + 1);
}
}
System.out.println(map);
int count = 0; //记录操作次数
for (char i = 'a'; i <= 'z'; i++) { //遍历map
while (map.get(i) >= 2) { //如果当前字符对应的值大于等于2,则需要进行操作
for (char j = 'a'; j <= 'z'; j++) { //遍历map,寻找为值为o的字符
if (map.get(j) == 0) {
map.put(j, map.get(j) + 1); //转化的值加1
map.put(i, map.get(i) - 2); //当前的值减2
count++;
System.out.println(map);
System.out.println(count);
break;
}
}
if(!map.containsValue(0)) {
map.put(i, map.get(i) - 1); //map中没有值为0的键,自己变自己,自身减1
count++;
System.out.println(map);
System.out.println(count);
}
}
}
System.out.println("总操作次数:"+count);
}