找出一个字符串中出现次数最多的字_487,重构字符串

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。

问题描述

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

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

示例 1:

输入: S = “aab”

输出: “aba”

示例 2:

输入: S = “aaab”

输出: “”

注意:

  • S 只包含小写字母并且长度在[1, 500]区间内。

问题分析

这题是让重新排布字符串S中的字符,让任何两个相邻的字符都不相同,如果能做到就返回排布后的字符串,如果做不到就返回空字符串。

如果要使得两相邻的字符不同,那么出现次数最多的那个数的数量必须满足下面条件,如下图所示,比如下面的a是出现次数最多的

c40cf09054ab9e71e2da745a29d05914.png

这个时候a的数量已经达到了临界值,如果再多一个a,那么至少有两个a是相邻的。所以这里出现次数最多的那个字符数量的临界值是threshold = (length + 1) >> 1(其中 length 是字符串的长度)

如果能使得两相邻的字符不同,我们可以先把出现次数最多的那个字符放到新数组下标为偶数的位置上,也就是从数组的第一个位置开始放,放完之后在用其他的字符填充数组剩下的下标为偶数的位置,如果下标为偶数的位置都填满了,我们就从下标为1开始,也就是数组的第2个位置开始,填下标为奇数的位置。

注意这里能不能先把出现次数最多的字符放到字符串下标为奇数的位置呢,当然是不可以的。比如我们上面举的例子abacaba本来是可以满足的,如果放到下标为奇数的位置,最后一个 a 就没法放了,除非放到最前面,那又变成了放到下标为偶数的位置了。

7da4c5372143423656280aadb14ac8a1.png

代码如下

public String reorganizeString(String S) {    //把字符串S转化为字符数组    char[] alphabetArr = S.toCharArray();    //记录每个字符出现的次数    int[] alphabetCount = new int[26];    //字符串的长度    int length = S.length();    int max = 0, alphabet = 0, threshold = (length + 1) >> 1;    //找出出现次数最多的那个字符    for (int i = 0; i < length; i++) {        alphabetCount[alphabetArr[i] - 'a']++;        if (alphabetCount[alphabetArr[i] - 'a'] > max) {            max = alphabetCount[alphabetArr[i] - 'a'];            alphabet = alphabetArr[i] - 'a';            //如果出现次数最多的那个字符的数量大于阈值,            // 说明他不能使得两相邻的字符不同,            // 直接返回空字符串即可            if (max > threshold)                return "";        }    }    //到这一步说明他可以使得两相邻的字符不同,    // 我们随便返回一个结果,res就是返回    //结果的数组形式,最后会再转化为字符串的    char[] res = new char[length];    int index = 0;    //先把出现次数最多的字符存储在数组下标为偶数的位置上    while (alphabetCount[alphabet]-- > 0) {        res[index] = (char) (alphabet + 'a');        index += 2;    }    //然后再把剩下的字符存储在其他位置上    for (int i = 0; i < alphabetCount.length; i++) {        while (alphabetCount[i]-- > 0) {            //如果偶数位置填完了,我们就让index从1开始,            // 填充下标为奇数的位置            if (index >= res.length) {                index = 1;            }            res[index] = (char) (i + 'a');            index += 2;        }    }    return new String(res);}

总结

这题直接判断比较简单,我们只需要统计出出现次数最多的字符即可。但这题还要返回结果,所以最简单的方式就是把出现次数最多的字符从数组的第一个位置开始放,每隔一个放一次。放完之后再用其他的字符从后面接着放,也是每隔一个,如果超出数组之后再从数组的第2个位置开始放,也是每隔一个,这样就能保证结果一定不会出错,并且也少了很多的判断。

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

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

相关文章

一、数据设计规范

一、数据设计规范 1、表的前缀 1、表名称不应该取得太长&#xff08;一般不超过三个英文单词。不推荐使用中文拼音&#xff0c;总的长度不要超过30个字符&#xff09; 格式:Tbl_Wms_log 表示 表_Wms系统_log 好处:执行查询方式辨别SQL类别(T_表-Table、V_视图-View、S_存储过…

http缓存管理器_小心缓存管理器

http缓存管理器如果使用spring和JPA&#xff0c;则很有可能利用ehcache&#xff08;或其他缓存提供程序&#xff09;。 您可以在两种不同的情况下进行此操作&#xff1a;JPA 2级缓存和spring方法缓存。 配置应用程序时&#xff0c;通常会设置JPA提供程序的二级缓存提供程序&am…

cad线加粗怎么设置_AutoCAD2019怎么加粗线条 将不同线段加粗方法

AutoCAD2019是一款非常专业的制图软件&#xff0c;那有很多用户表示自己不知道这款软件怎么加粗线条&#xff0c;下面就通过这篇文章给大家介绍一下&#xff0c;一起往下看吧&#xff01;如图所示&#xff0c;我用L命令绘制一根线段&#xff1a;&#xff0c;这根线段的宽度为默…

时间管理——你不可不知的3种时间管理方法

时间管理——你不可不知的3种时间管理方法 时间管理 英文名:Time Management   请问&#xff0c;如果每天都有86400元进入你的银行户头&#xff0c;而你必须当天用光&#xff0c;你会如何运用这笔钱&#xff1f;   天下真有这样的好事吗&#xff1f;   是的&#xff0c;…

python tkinter布局混用_[宜配屋]听图阁

这篇文章主要介绍了python tkinter控件布局项目实例,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下代码部分&#xff1a;from tkinter import *import tkinter.messagebox as messageboxclass Tkdemo():def __i…

ASP.NET中利用ashx实现图片防盗链

盗链的危害我就不说了&#xff0c;网上有很多。 直接分析盗链原理&#xff1a;看下面用httpwatch截获的http发送的数据 GET /Img.ashx?imgsvn_work.gif HTTP/1.1 Accept: */* Referer: http://www.svnhost.cn/ Accept-Language: zh-cn UA-CPU: x86 Accept-Encoding: gzip, def…

适用于Java开发人员的Elasticsearch:Java的Elasticsearch

本文是我们学院课程的一部分&#xff0c;该课程的标题为Java开发人员的Elasticsearch教程 。 在本课程中&#xff0c;我们提供了一系列教程&#xff0c;以便您可以开发自己的基于Elasticsearch的应用程序。 我们涵盖了从安装和操作到Java API集成和报告的广泛主题。 通过我们简…

matlab 日期排序_MATLAB时间序列的排序函数

sort功能&#xff1a;对时间序列x进行排序。格式&#xff1a;m sort(x, mode) % 当参数mode‘ascend’&#xff0c;表示对x进行升序重排&#xff1b;当mode‘descend’&#xff0c;表示降序重排wrev功能&#xff1a;得到时间序列x的逆序。格式&#xff1a;m wrev(x)如>>…

c标签foreach遍历list_遍历 Dictionary,你会几种方式?

一&#xff1a;背景 1. 讲故事昨天在 StackOverflow 上看到一个很有趣的问题&#xff0c;说: 你会几种遍历字典的方式&#xff0c;然后跟帖就是各种奇葩的回答&#xff0c;挺有意思&#xff0c;马上就要国庆了&#xff0c;娱乐娱乐吧&#xff0c;说说这种挺无聊的问题???。二…

[HDU 4666]Hyperspace[最远曼哈顿距离][STL]

题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态下各点的计算值, 插入或删除一个点就更新一次每种状态(用 multiset 或 map 或 priority_queue 实…

过滤器匹配符包含单词_Hamcrest包含匹配器

过滤器匹配符包含单词与Hamcrest 1.2相比 &#xff0c;针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档。 例如&#xff0c;四个重载的contains方法具有更具描述性的Javadoc文档&#xff0c;如下面所示的两个比较屏幕快照所示。 尽管仅通过尝试就可以…

linux配置4g网络命令_树莓派移动网络连接(配置4G网卡)

1、识别上网卡使用命令lsusb&#xff0c;如果能够识别则可以继续往下。2、安装网卡驱动程序上网卡一般都会带有2个功能&#xff0c;一个是虚拟光驱&#xff0c;用来安装驱动程序&#xff1b;另一个是进行网络连接的modem。在Linux下&#xff0c;需要安装usb-modeswitch驱动程序…

Hibernate 配置详解(5)

9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的&#xff0c;使用这个设置可以配置hibernate在做batch-fetch的时候&#xff0c;生成SQL的策略。该配置项的可选值为org.hibernate.loader.BatchFetchStyle这个枚举类型中的可选值。所以&#xff0c;目前有三个选…

使用HazelCast进行休眠缓存:JPA缓存基础知识

HazelCast的最大功能之一就是对hibernate二级缓存的支持 。 JPA具有两个级别的缓存。 一级缓存在事务期间缓存对象的状态。 通过查询相同的对象两次&#xff0c;您必须获得第一次获取的对象。 但是&#xff0c;在包含您检索到的对象并访问数据库的复杂查询的情况下&#xff…

mvcc原理_Mysql MVCC实现原理

本文中用到的概念解释数据读取特性不可重复读指一个事务范围内两个相同的查询却返回了不同数据这是由于查询时系统中其他事务修改的提交而引起的幻读在两个连续的查找之间一个并发的修改事务修改了查询的数据集&#xff0c;导致这两个查询返回了不同的结果这是由于查询时系统中…

java数组复制的方式和效率比较

java中&#xff0c;数组的复制有以下三种方式&#xff1a; 1. 调用System.arraycopy&#xff08;Arrays.copyOfRange可以当作第四种&#xff0c;但是底层调用的是System.arraycopy&#xff0c;所以&#xff0c;认为是同一种&#xff0c;下面是Arrays.copyOfRange的方法实现&…

Java命令行界面(第18部分):JCLAP

Giles Winstanley的JCLAP &#xff08; Java命令行参数解析器 &#xff09;是基于Java的命令行处理库的系列文章中介绍的第18个库。 这篇文章的示例基于需要Java 8的 JCLAP 1.4 。 JCLAP主页上指出&#xff1a;“ JCLAP帮助Java开发人员为其应用程序创建易于使用的命令行界面。…

数据拆分_数据拆分,偏方请拿好

小伙伴们好啊&#xff0c;今天老祝和大家分享一个比较特殊的数据拆分实例。先来看一组数据&#xff1a;这是一些从系统中导出的数据&#xff0c;一个序号后面连接一个姓名&#xff0c;但是现在都挤在了一个单元格里。咱们要把这些数据变成下面的效果&#xff1a;接下来&#xf…

sql文字转换全拼_取汉字全拼的SQL函数

/*根据汉字获取全拼1.生成所有读音临时表2.根据Chinese_PRC_CS_AS_KS_WS 排序获取读音*/CREATE function f_GetPinYin(str varchar(100))returns varchar(8000)asbegindeclare re varchar(8000)--生成临时表declare t table(chr nchar(1) collate Chinese_PRC_CS_AS_KS_WS,py n…

jaxb入门_JAXB教程–入门

jaxb入门注意&#xff1a;请查看我们的Java XML绑定JAXB教程– ULTIMATE指南 什么是JAXB&#xff1f; JAXB代表用于XML绑定的Java体系结构。它用于将XML转换为java对象&#xff0c;并将java对象转换为XML。JAXB定义了一个用于在XML文档中读写Java对象的API。与SAX和DOM不同&am…