LeetCode 767. 重构字符串(堆)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:
输入: S = "aab"
输出: "aba"示例 2:
输入: S = "aaab"
输出: ""注意:
S 只包含小写字母并且长度在[1, 500]区间内。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorganize-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

参考 LeetCode 358. K 距离间隔重排字符串(贪心+优先队列),一模一样,K=2本题

struct cmp
{	bool operator()(pair<char,int>& a, pair<char,int>& b){return a.second < b.second;//数量多的优先}
};
class Solution {
public:string reorganizeString(string S) {int maxcount = 0;vector<int> count(26, 0);for(char c : S){count[c-'a']++;maxcount = max(maxcount, count[c-'a']);}if(maxcount > (S.size()+1)/2)return "";priority_queue<pair<char,int>, vector<pair<char,int>>, cmp> q;for(int i = 0; i < 26; ++i){if(count[i]>0)q.push({'a'+i, count[i]});}string ans;while(q.size() >= 2){vector<pair<char,int>> tmp;int dis = 2;while(dis--){auto tp = q.top();q.pop();char c = tp.first;int num = tp.second;ans += c;num--;if(num > 0)tmp.push_back({c, num});}for(auto& p : tmp)q.push(p);}while(!q.empty()){if(q.top().second == 1){ans += q.top().first;q.pop();}elsereturn "";}return ans;}
};

4 ms 6.3 MB

本题还可以:

  • 字符计数,按频数排序,大的先放
  • 奇偶位置插空放置即可
class Solution {
public:string reorganizeString(string S) {int maxcount = 0;vector<int> count(26, 0);for(char c : S){count[c-'a']++;maxcount = max(maxcount, count[c-'a']);}if(maxcount > (S.size()+1)/2)return "";vector<pair<char,int>> char_num;for(int i = 0; i < 26; i++){if(count[i])char_num.push_back({'a'+i, count[i]});}sort(char_num.begin(), char_num.end(),[&](auto& a, auto& b){return a.second > b.second;//数量多的优先});string ans(S.size(), ' ');int idx = 0, i = 0;while(i < S.size() && char_num[idx].second > 0){ans[i] = char_num[idx].first;i += 2;if(--char_num[idx].second == 0)idx++;}i = 1;while(i < S.size() && char_num[idx].second > 0){ans[i] = char_num[idx].first;i += 2;if(--char_num[idx].second == 0)idx++;}return ans;}
};

0 ms 6.2 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.数据库设计

三范式 经过研究和对使用中问题的总结&#xff0c;对于设计数据库提出了一些规范&#xff0c;这些规范被称为范式 数据库设计中一共有6个范式&#xff0c;一般需要遵守3范式即可 第一范式&#xff08;1NF)&#xff1a;数据库表的每一列都是不可分割的原子数据项&#xff0c;…

minix中atoi、atol、atof的实现

在minix2.0源代码中&#xff0c;有将字符串类型转换为int、long、double类型的函数实现&#xff0c;相关的实现函数分别在atoi.c、atol.c、atof.c文件中&#xff0c;我们来逐一学习其中的源码&#xff1a; 1、int atoi(register const char *nptr) &#xff1a;将字符串类型转换…

LeetCode 729. 我的日程安排表 I(set 二分查找)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间内增加…

java基础之lambda表达式

java基础之lambda表达式 1 什么是lambda表达式 lambda表达式是一个匿名函数&#xff0c;允许将一个函数作为另外一个函数的参数&#xff0c;将函数作为参数传递&#xff08;可理解为一段传递的代码&#xff09;。 2 为什么要用lambda表达式 lambda表达式可以写出更简洁更灵…

6.数据查询(条件

查询所有字段select * from 表名; 例&#xff1a;select * from students; 查询指定字段 在select后面的列名部分&#xff0c;可以使用as为列起别名&#xff0c;这个别名出现在结果集中 select 列1,列2,... from 表名; -- 表名.字段名 select students.id,students.name,su…

开源代码分析技巧之——打印调用逻辑

开源代码分析技巧之——打印调用逻辑 在研究开源代码时&#xff0c;大家或许都有这样的感慨&#xff1a; &#xff08;1&#xff09;代码太庞大&#xff0c;少则几万行代码&#xff0c;多则几百万行代码&#xff0c;不知道如何入手&#xff1b; &#xff08;2&#xff09;相关的…

LeetCode 731. 我的日程安排表 II(set二分查找 / 差分思想)

文章目录1. 题目2. 解题2.1 set 二分查找2.2 差分思想1. 题目 实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内不会导致三重预订时&#xff0c;则可以存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)方法。 它意味着在 start 到 end 时间…

7.排序、聚合函数、分组查询

排序 语法&#xff1a; select * from 表名 order by 列1 asc|desc,列2 asc|desc,... asc从小到大排列&#xff0c;即升序&#xff0c;也可不写&#xff1b; desc从大到小排序&#xff0c;即降序 例1&#xff1a;查询未删除男生信息&#xff0c;按学号降序 select * from…

JSON数据格式以及与后台交互数据转换实例

/*作者&#xff1a;烟大阳仔时间&#xff1a;20131013介绍:主要了解一下json的格式&#xff0c;看看数据是怎么存储的 */ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> &…

05.序列模型 W1.循环序列模型

文章目录1. 为什么选择序列模型2. 数学符号3. 循环Recurrent 神经网络模型4. 通过时间的反向传播5. 不同类型的循环神经网络6. 语言模型和序列生成7. 对新序列采样8. 循环神经网络的梯度消失9. Gated Recurrent Unit&#xff08;GRU单元&#xff09;10. LSTM&#xff08;long s…

8.分页、连接、自关联查询

获取部分行 语法 select * from 表名 limit start,count 从start开始&#xff0c;获取count条数据 start索引从0开始 例1&#xff1a;查询前3行男生信息 select * from students where gender1 limit 0,3; 分页 已知&#xff1a;每页显示m条数据&#xff0c;当前显示第n…

C语言宏定义取得两数的最大值和最小值

/*本程序时为了验证用宏来做 * 两个数的大小比较的写法*/#include<stdio.h>#define MAX(x,y) ((x)<(y)?(y):(x))#define MIN(X,Y) ({\ typeof (X) x_ (X);\ typeof (Y) y_ (Y);\ (x_ < y_) ? x_ : y_; })/*({...})的作用是将内部的几条语句中最后一条的值返回&…

9.数据库中的子查询

子查询 在一个 select 语句中,嵌入了另外一个 select 语句,那么被嵌入的 select 语句称之为子查询语句 主查询 主要查询的对象,第一条 select 语句 主查询和子查询的关系 子查询是嵌入到主查询中 子查询是辅助主查询的,要么充当条件,要么充当数据源 子查询是可以独立存在的语句…

LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

文章目录1. 题目2. 解题1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。 现在, 如果我们最后能走到终点&#xff0c;那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 K…

oracle 重建 sys密码文件

需要重建密码文件,具体步骤如下: 1.首先,确定你的密码文件的路径和名称: 在windows下 密码文件路径oracle_home\database 密码文件名称pwdsid.ora 在unix下 密码文件路径oracle_home/dbs 密码文件名称pwdsid Sid为实例名称,查看实例名称 Select instance_name from v$in…

10.数据库中的内置函数

字符串函数 查看字符的ascii码值ascii(str)&#xff0c;str是空串时返回0 查看ascii码值对应的字符char(数字)&#xff1a;select char(97); 拼接字符串concat(str1,str2...)&#xff1a;selectconcat(12,34,ab); 包含字符个数length(str)&#xff1a;selectlength(abc); 截…

Java基础10(反射)

Java基础10&#xff08;反射&#xff09; 1 什么是反射 官方解释&#xff1a;反射&#xff08;reflection&#xff09;技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现。它是一个相对而言比较高级的技术&#xff0c;反射是一种强有力的技术特性&#xff0c;因此…

05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)

文章目录作业1&#xff1a;建立你的循环神经网络1. RNN 前向传播1.1 RNN 单元1.2 RNN 前向传播2. LSTM 网络2.1 LSTM 单元2.2 LSTM 前向传播3. RNN 反向传播3.1 基础 RNN 反向传播3.2 LSTM 反向传播3.3 LSTM RNN网络反向传播作业2&#xff1a;字符级语言模型&#xff1a;恐龙岛…

给年轻工程师的十大忠告

给年轻工程师的十大忠告 转自http://blog.163.com/tgyeboy02126/blog/static/167507500201191102114940/诸位&#xff0c;咱当电子工程师也是十余年了&#xff0c;不算有出息&#xff0c;环顾四周&#xff0c;也没有看见几个有出息的&#xff01;回顾工程师生涯&#xff0c;感…

11.MYSQL高级(一)

1.账户管理 在生产环境下操作数据库时&#xff0c;绝对不可以使用root账户连接&#xff0c;而是创建特定的账户&#xff0c;授予这个账户特定的操作权限&#xff0c;然后连接进行操作&#xff0c;主要的操作就是数据的crud MySQL账户体系&#xff1a;根据账户所具有的权限的不…