[蓝桥杯 2020 国 C] 重复字符串(找规律,枚举)

        由题目我们可知,如果字符串的长度不是k的倍数,那么字符串就无法修改,因此直接输出-1即可,并且我们为了达到最少的修改次数,我们将字符串分成k段,每一段对应的字符数量最多的字符不进行修改,从而可以达到最少的修改次数,而对于统计字符的数量,我们可以用哈希表(map)来进行存储,并提取出最大的数量即可
 

上代码 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;


int main(void)
{
	int k; cin >> k;
	string s; cin >> s;
	int len = s.size();//获取字符串总长度

	if (len % k != 0) {
		cout << -1 << endl;
		return 0;//如果字符串长度不是k的整数倍,那么就无法修改,直接返回-1 
	}

	int t = len / k;//获取每个子串的长度

	map <char, int> mp;
	int ans = 0;
	int maxn = -1;
	for (int i = 0; i < t; i++) {//从第一个子串的第i个字符开始 
		maxn = -1;
		for (int j = i; j < len; j += t) {//每次跳跃长度t,获取下一个子串对应的字符 
			mp[s[j]]++;//统计每个字符的数量
			maxn = max(mp[s[j]], maxn);//获取最多数目 
		}
		ans += (k - maxn);
		mp.clear();//清空map 
	}
	cout << ans << endl;

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值