【贪心】重构字符串


/**
 *  思路:如果s长度小于2,直接返回s,假设字符串s的长度为n。
 *        n为偶数,如果字符串中的某个字符数量超过 n/2 则肯定会存在相邻的字符。
 *        n为奇数,如果字符串中的某个字符的数量超过 (n+1)/ 2 ,肯定会存在相邻的字符。
 *        因为n为偶数时 (n+1)/2等于n/2,所以可以合并上面的两个情况。
 *        然后构建优先队列,优先队列是使用堆实现的,然后构建大顶堆。
 *        每次从优先队列取出出现次数最多的两个字符加入到结果中,
 *        然后将次数不为0 的字符再重新添加到优先队列中。
 * @auther start
 * @create 2024-01-12 14:34
 */
public class L767 {
    public String reorganizeString(String s) {
        int len = s.length();
        if (len < 2) return s;
        int[] count = new int[26];
        int maxCount = 0;
        //统计字符出现次数
        for (int i = 0; i < len; i++) {
            char c = s.charAt(i);
            count[c - 'a']++;
            //出现最多的字符次数
            maxCount = Math.max(maxCount, count[c - 'a']);
        }
        //肯定有相邻字符出现的情况
        if (maxCount > (len + 1) / 2) {
            return "";
        }
        //构建优先队列
        PriorityQueue<Character> queue = new PriorityQueue<>(new Comparator<Character>() {
            @Override
            //构建大顶堆
            public int compare(Character o1, Character o2) {
                return count[o2 - 'a'] - count[o1 - 'a'];
            }
        });
        //添加字符到优先队列中
        for (char c = 'a'; c <= 'z'; c++) {
            if (count[c - 'a'] > 0) {
                queue.offer(c);
            }
        }
        StringBuffer res = new StringBuffer();
        while (queue.size() > 1) {
            //取出优先队列中的两个字符
            char c1 = queue.poll();
            char c2 = queue.poll();
            //添加到结果中
            res.append(c1);
            res.append(c2);
            int idx1 = c1 - 'a', idx2 = c2 - 'a';
            //这两个字符数量减一
            count[idx1]--;
            count[idx2]--;
            //判断这两个字符的数量是否大于1,大于1重新加入到优先队列中
            if (count[idx1] > 0)
                queue.offer(c1);
            if (count[idx2] > 0)
                queue.offer(c2);
        }
        //字符串长度为奇数的情况,取出最后一个字符
        if (queue.size() > 0) {
            res.append(queue.poll());
        }
        return res.toString();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绘图工具用的好,头发掉的少

程序员不管是在学习&#xff0c;还是工作过程中&#xff0c;很多时候都需要画图&#xff0c;如产品分析、架构设计、方案选型等&#xff0c;良好的绘图不仅可以让绘图者的思路清晰&#xff0c;也可以让聆听者更好的理解。用好画图&#xff0c;升职加薪少不了&#xff01;今天介…

大数据技术之Hudi

第1章 Hudi概述 1.1 Hudi简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和…

PPT文档怎么转换PDF?一个方法教你快速实现

在我们的办公、学习中难免会遇到需要将ppt转pdf文件的需求。现在的网络中有各种各样的PDF转换工具&#xff0c;有些操作很复杂&#xff0c;有些需要下载软件非常麻烦。接下来&#xff0c;给大家分享一款草最简单还不用下载软件的PPT转PDF&#xff08;https://www.yasuotu.com/p…

Linux中常使用的命令之ls、cd、pwd、mkdir、rmdir

ls: 列出目录 cd&#xff1a;切换目录 pwd&#xff1a;显示目前的目录 mkdir&#xff1a;创建一个新的目录 -m &#xff1a;配置文件的权限-p &#xff1a;帮助你直接将所需要的目录(包含上一级目录)递归创建起来&#xff01; rmdir&#xff1a;删除一个空的目录 注意这…

2024年该如何招聘科技人员

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 过去几年科技领域发生了令人难以置信的动荡。我可以有把握地说&#xff0c;今天的就业市场比 2000 年代我第一次成为开发人员时更具挑战性。人工智能的繁荣与前所…

conda环境下cannot write keep file问题解决

1 问题描述 conda环境下执行如下命令报错&#xff1a; pip install githttps://github.com/wenet-e2e/wenet.git 错误信息如下&#xff1a; (pt) PS D:\code\ptcontainer> pip install githttps://github.com/wenet-e2e/wenet.git Looking in indexes: http://pypi.doub…

Qt OpenGL初探 - 画坐标轴

Qt OpenGL初探 - 画坐标轴 引言一、过程详解1.1 项目创建1.2 实现细节 二、核心代码三、官方文档3.1 官网地址3.2 官方手册的使用 引言 Qt OpenGL模块可以很方便地将OpenGL应用在Qt程序中&#xff0c;本文使用其画了一个3D坐标轴(见上图),并详细讲解了具体的编码过程与官方手册…

优化的实时换脸项目——DeepFaceLive

DeepFaceLive是一款基于人工智能技术的换脸工具&#xff0c;可以实现实时面部捕捉和换脸效果。它利用深度学习和计算机视觉算法&#xff0c;能够以惊人的准确度和速度将脸部特征无缝地映射到任何人的脸上。DeepFaceLive的特点是可以实时换脸&#xff0c;让用户通过网络摄像头应…

JVM基础(12)——G1调优

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

BitMap源码解析

文章目录 前言数据结构添加与删除操作 JDK中BitSet源码解析重要成员属性初始化添加数据清除数据获取数据size和length方法集合操作&#xff1a;与、或、异或优缺点 前言 为什么称为bitmap&#xff1f; bitmap不仅仅存储介质以及数据结构不同于hashmap&#xff0c;存储的key和v…

没啥特长又想搞钱的进:2024副业小项目推荐

利用副业赚钱&#xff0c;绝对不是找个项目就做那么简单。实际上&#xff0c;网上很多副业项目都是看着高大上&#xff0c;做起来还不如送外卖、打零工实在。思路决定出路&#xff0c;你需要的不是具体的副业项目&#xff0c;你需要的是副业思维。 思维一;经验的二次利用比如你…

【iOS】数据持久化(四)之FMDB基本使用

正如我们前面所看到的&#xff0c;原生SQLite API在使用时还是比较麻烦的&#xff0c;于是&#xff0c;开源社区就出现了一系列将SQLite API进行封装的库&#xff0c;其中FMDB的被大多数人所使用 FMDB和SQLite相比较&#xff0c;SQLite比较原始&#xff0c;操作比较复杂&#…

Unity摇杆+键鼠控制位移、旋转

1、位移 首先我们找到两张图片&#xff0c;一个大圆一个小圆&#xff0c;像这样&#xff1a; 结构是这样的&#xff1a; 然后&#xff0c;新建一个场景&#xff0c;用胶囊去做玩家&#xff0c;摄像机在胶囊下&#xff0c;并且在场景中放两个cube作为参照物 像这样搭好后&#…

【电源专题】案例:在EN脚加个电阻就能解决电源下电输出振荡?

案例背景:在某产品上使用一颗升压芯片发现下电输出波形振荡,但此产品并不是第一个使用此升压芯片的。早先此升压芯片使用在其他产品上没有报过这个异常。 分析方法:使用DEMO板,查看标准DEMO板无异常。将异常板卡上的参数与全部换到DEMO板上发现同样存在异常。 推测原因:…

学习就要从简单的开始嘛,开始学一个个人博客吧

做一个个人博客第一步该怎么做&#xff1f; 好多零基础的同学们不知道怎么迈出第一步。 那么&#xff0c;就找一个现成的模板学一学呗&#xff0c;毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题&#xff0c;那就是&#xff0c;那些模板都&#xff0c;太&#xff01;…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的校园预点餐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

Linux常用命令之tar解压缩文件、uname -a查看系统信息

tar&#xff1a;解压缩 *.Z-------------------compress程序压缩的文件*.gz------------------gzip程序压缩的文件*.bz2-----------------bzip2程序压缩的文件*.tar------------------tar程序打包的数据,并没有压缩*.tar.gz---------------tar程序打包的文件,其中经过gzip的压…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

关于lombok插件的使用

在 idea 中有个非常好用的插件 lombok&#xff0c;可以用来在实体类中自动生成 get 、set以及构造方法&#xff0c;下面我们来学习如何使用它&#xff1a; 首先打开settings&#xff0c;按照以下方法&#xff1a; 到 marketplace 中搜索 lombok&#xff0c;我这里已经安装好了…