说在前面,本题的标程是存在问题的,下面会分析标程与正确程序
题目
题目连接
题解思维吧。
整体思路:将字符串分割成k段,假设每段m个字符,我们统计每段相同位置的每种字符出现的次数,每段都统计上后,每个位置(0 ~ m-1)都取出现次数最多的字符作为要变成的字符,将每一段的对应位置的字符都变成这个字符就行了,因为这个字符在该位置出现最多,其他字符变到该字符能保证次数最少,如果要是变成别的字符,那么出现次数最多的字符变动次数会很多,并非最优解。累加每个位置(0 ~ m-1)上变换次数就是答案。
关于标程出错的问题:
正常人的思路,包括题目也说“字符串 S 恰好可以由某个字符串重复 K 次得到”,很容易想到如果k不能整除字符串长度,那么输出-1;但是标准程序的判断方式是,如果长度小于k输出-1,因为标程不要求能整除才算合法,即使存在不到m个的一段,我们就将这段忽略即可,只按照上面的思路处理前面长度为m的多干段即可,由于长度小于k时会输出0,而这显然应该输出-1,所以特判。
代码 非AC但正确的代码#include
using namespace std;
const int N = 1e5+10;
int k, ans, cnt[N][30], res[N];
// cnt[i][j]: i:[0, m), j:[0, 26) 统计每一段第i个位置字符j+'a'出现的次数
// res[i]: i:[0, m) 每一段第i个位置字符出现的最大次数
string s;
int main()
{
cin >> k;
cin >> s;
if (s.size () % k) return puts ("-1"), 0;
int m = s.size() / k; // 每段长度
for (int i = 0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?