字符串操作【编程题】

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);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值