【蓝桥杯】历届真题 重复字符串(省赛)Java

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述
        如果一个字符串 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 ≤ K ≤ 100000, 1 ≤ | S | ≤ 100000。其中 | S | 表示 S 的
长度。

前言

        这道题在解的过程中发现了点问题,可能是测试用例的问题。

        因题中所说的是:如果s无法修改成k次重复字符串,输出-1,所以在最开始判断一下。

        if(len%k != 0){
            System.out.println(-1);
            return;
        }

        但加上上述代码后,只有90,最后一个测试用例拿不到分。

        因此官方数据错误,不完整的循环节也输出了答案,例如 abcde 当 k 取 3 的时候,可以修改为 abc,这是不符合题意的。
        如果非要过官方OJ,修改代码 -1 输出的条件为 length < k,且将字符串长度截断为abc即可。

思路及分析

        若字母序列为aab,要让它们一样,只需要将b改为a即可,即变化成aaa。

        由此可知,只需要找到这一列中哪个字母数最多的,那么剩下的字母都改为该字母是操作最少的。

        因此,我们只需要统计每一个字母序列中出现次数最多的字母出现的次数即可,记为max,那么用该列的长度k减去max,即为该列需要更改的次数。

代码

import java.util.*;

public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int k = sc.nextInt();
		String str = sc.next();
		char[] c = str.toCharArray();
		
		int len = str.length();
		if(len%k != 0){
			System.out.println(-1);
			return;
		}
		int sum = 0;
		int max = 0;
		int temp = 0;
		int[] arr = new int[26];
		
		for(int i=0; i<arr.length; i++){
			arr[i] = 0;
		}
		
		for(int i=0; i<len/k; i++){
			for(int j=i; j<len; j+=(len/k)){
				temp = (int)(c[j]-'a');
				arr[temp]++;
			}
			for(int m=0; m<arr.length; m++){
				if(arr[m]>max){
					max = arr[m];
				}
			}
			sum += (k-max);
			max = 0;
			for(int n = 0; n<arr.length; n++){
				arr[n]=0;
			}
		}
		System.out.println(sum);
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值