题解

通常直接思考最佳策略是十分困难的,我们不妨思考每一种情况需要如何处理:

  1. 整个字符串只有一种字符

    若字符串长度为 \(1\),那么字符串本身即为答案;

    若字符串长度大于等于 \(2\),那么不存在可行方案

  2. 整个字符串只有两种字符 \(c_1,c_2\),数量分别为 \(n_1,n_2\)

    若字符 \(c_1\) 的数量 \(n_1\) == 字符 \(c_2\) 的数量 \(n_2\),明显字符 \(c_1\) 和字符 \(c_2\) 交替出现即可

    若字符 \(c_1\) 的数量 \(n_1\) > 字符 \(c_2\) 的数量 \(n_2\),那么每两个字符 \(c_1\) 之间必须插入一个字符 \(c_2\),也就是 \(n_1 - 1 \leq n_2\)。进一步思考,\(abs(n_1-n_2)\) 可以大于 \(1\) 吗?答案是不行,因为无法为每两个字符 \(c_1\) 之间插入一个字符 \(c_2\)

    若字符 \(c_1\) 的数量 \(n_1\) < 字符 \(c_2\) 的数量 \(n_2\),情况类似于 \(n_1 > n_2\) 的情况

    从只有两种字符的情况,易得到启发:出现次数最多的字符,每两个之间必须插入至少一个不同的字符

  3. 整个字符串有 \(n(1 \leq n \leq 26)\) 种字符,第 \(i\) 种字符的数量为 \(n_i\)

    由只有两种字符的字符串重构成功的方案来看,在有 \(n\) 种类字符的字符串中,需要首先处理出现次数最多的元素,不妨记出现次数为 \(m = max(n_i)\)

    如下图所示,至少需要在 \(m\) 个元素之间插入一个与左右相邻元素均不同的元素:

    所以,只需要将 \(m\) 个出现次数最多的元素(若有多个出现次数最多的元素,任意选择其中一个即可)先依次放入位置 \(x_j(1 \leq j \leq m)\),随后将剩下的全部元素,按种类依次从位置 \(x_1\) 填到为止 \(x_m\)即可。

    若 全部元素个数 - \(m < m - 1\),则无解,否则有解。

问:为什么维护出现次数最多的种类元素是可行的方案?

答:因为题目要求的是相邻两个元素不可相同,那么在字符串中全部种类的单种元素的出现次数都不会超过\(max(n_i)\)。因此,只需要先维护其中一个出现次数最多的元素,并将剩余的元素按种类依次填入这\(max(n_i)\)个元素之后,必定符合每两个相邻元素不同的要求。按种类填入指的是,按单种元素依次从前往后连续插入(换一种元素后从上次插入的位置之后的第一个位置开始)。

参考代码

class Solution {
public:
string reorganizeString(string s) {
string ans;
vector<int> mp(26);
for (auto &it: s) {
mp[it - 'a'] ++;
}
int mx = 0, idx = 0, sum = 0;
for (int i = 0; i < 26; ++ i) {
if (mx < mp[i]) {
mx = mp[i];
idx = i;
}
sum += mp[i];
}
if (sum - mx >= mx - 1) {
vector<vector<char>> v(mx);
for (auto &it: v) {
it.push_back('a' + idx);
}
mp[idx] = 0;
int cur = 0;
for (int i = 0; i < 26; ++ i) {
while (mp[i] > 0) {
v[cur].emplace_back('a' + i);
cur = (cur + 1) % mx;
-- mp[i];
}
}
for (auto &u: v) {
for (auto &i: u) {
ans.push_back(i);
}
}
}
return ans;
}
};

【相邻不同型贪心】LeetCode767 重构字符串的更多相关文章

  1. [Swift]LeetCode767. 重构字符串 | Reorganize String

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  2. Java实现 LeetCode 767 重构字符串(ASCII的转换)

    767. 重构字符串 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同. 若可行,输出任意可行的结果.若不可行,返回空字符串. 示例 1: 输入: S = "aab&qu ...

  3. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  4. Java把长整型时间转成字符串日期

    数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...

  5. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  6. python基础一整型、bool、字符串

    1整型.bool.字符串 1.整型 --数字(int) ​ 用于比较运算的 ​ 32位 -2 ** 31 ~ 2 ** 31 -1 ​ 64位 -2 ** 63 ~ 2 ** 63 -1 ​ 基础运算 ...

  7. [Usaco 2012 Feb]Cow coupons牛券:反悔型贪心

    Description Farmer  John  needs  new  cows! There  are  N  cows  for  sale (1 <= N <= 50,000), ...

  8. [LeetCode] Reorganize String 重构字符串

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  9. [LeetCode] 767. Reorganize String 重构字符串

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  10. 整型(int)转时间格式字符串及页面long型转时间格式字符串

    1,如果是封装的整型的话需要在后台进行处理再返回页面 处理过程是这样的 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm ...

随机推荐

  1. .NET 工具库高效生成 PDF 文档

    前言 QuestPDF 是一个开源 .NET 库,用于生成 PDF 文档.使用了C# Fluent API方式可简化开发.减少错误并提高工作效率.利用它可以轻松生成 PDF 报告.发票.导出文件等. ...

  2. Win11本地部署FaceFusion3最强AI换脸,集成Tensorrt10.4推理加速,让甜品显卡也能发挥生产力

    FaceFusion3.0.0大抵是现在最强的AI换脸项目,分享一下如何在Win11系统,基于最新的cuda12.6配合最新的cudnn9.4本地部署FaceFusion3.0.0项目,并且搭配Ten ...

  3. 【赵渝强老师】NoSQL数据库之Cassandra基础

    一.Cassandra简介 Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable.其主要功能比Dynamo (分布式的Key-Value存储系统)更丰富,但支持度却不如 ...

  4. LeetCode 1349. 参加考试的最大学生数 (状压DP 或 二分图最大独立子集)

    给你一个 m * n 的矩阵 seats 表示教室中的座位分布.如果座位是坏的(不可用),就用 '#' 表示:否则,用 '.' 表示. 学生可以看到左侧.右侧.左上.右上这四个方向上紧邻他的学生的答卷 ...

  5. linux中安装mysq5.7

    linux中安装mysq5.7 一. 安装mysql yum install mariadb-server mariadb 二. 开启mysql service mysqld start 四. 停止m ...

  6. yarn serve 不能开启vue项目 the project seem to require yarn but isnot install

    error: answer: 删除 yarn.lock 或者使用 npm run serve 替换 ; ps: yarn.lock 是锁定第三方包版本的文件:

  7. 什么是数据库连接池druid

    每次数据库连接都要断开重连浪费时间,性能 [ 底层需要 tcp 连接 ] 资源复用 : 提升系统响应速度 : 避免数据库连接遗漏 :[ 长时间不操作会强制断开 ] 使用: 初始连接数:连接的个数 pa ...

  8. Android复习(三)清单文件中的元素

    <action> 向 Intent 过滤器添加操作. <activity> 声明 Activity 组件. <activity-alias> 声明 Activity ...

  9. 鸿蒙NEXT开发声明式UI是咋回事?

    大家好,我是 V 哥,ArkTS 是 HarmonyOS 优选的主力应用开发语言,它在 TypeScript 的基础上进行了扩展,提供了声明式 UI 描述.自定义组件和动态扩展 UI 元素的能力.这些 ...

  10. 在 Debian 12 上安装 KubeSphere 实战入门

    老 Z,运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes.KubeSphere.DevOps.OpenStack.Ansible 等. 前言 知识点 定级:入 ...