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

问题描述

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

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

示例 1:

输入: S = “aab”

输出: “aba”

示例 2:

输入: S = “aaab”

输出: “”

注意:

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

问题分析

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

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

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

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

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

代码如下

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个位置开始放,也是每隔一个,这样就能保证结果一定不会出错,并且也少了很多的判断。

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

  1. python counter 出现次数最少的元素_[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法...

    问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...

  2. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

  3. 找出一个数组中出现次数最多的那个元素

    Description 找出一个数组中出现次数最多的那个元素 Input 多组输入,请处理到文件结束 每组第一行输入一个整数n(不大于20) 第二行输入n个整数 Output 找出n个整数中出现次数最 ...

  4. 找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)

    在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题. 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到 ...

  5. 找出一个字符串中出现次数最多的字_Day34:第一个只出现一次的字符

    剑指Offer_编程题--第一个只出现一次的字符 题目描述: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置,如果没有则返回-1 ...

  6. 【算法】大搜车——找出一个字符串中出现次数最多的字符,如果有多个出现次数相同的字符,那就找出最先出现的那个字符

    题目描述:找出一个字符串中出现次数最多的字符,如果有多个出现次数相同的字符,那就找出最先出现的那个字符 思考: 我的第一反应是分三步: 遍历字符串,统计每个字符出现的次数 找出最大的次数 找出最大次数 ...

  7. 找一个字符串中出现次数最多的字符

    第一种: str = 'asdasddsfdsfadsfdghdadsdfdgdasd'str = str.split('');console.log(str);var newStr = {};// ...

  8. 面试题:寻找一个字符串中出现次数最多的字符以及出现的次数

    要求编写代码实现:寻找一个字符串中出现次数最多的字符以及出现的次数. 解法一:用删除法实现 (挺巧妙的一种) public class FindTheMostAppearChar {public st ...

  9. 重复最多字符次数java_利用Java实现求字符串中出现次数最多的字符及次数

    利用Java实现求字符串中出现次数最多的字符及次数 发布时间:2020-11-12 16:57:24 来源:亿速云 阅读:108 作者:Leah 这篇文章将为大家详细讲解有关利用Java实现求字符串中 ...

最新文章

  1. MatLab GUI Load .mat File 导入mat文件
  2. 2017前端面试题之综合篇(1)
  3. Linux内核模块的概念和基本的编程方法
  4. TechEd2010
  5. rust投递箱连接箱子_拆了的快递包装丢哪里?闵行试行24小时开放的网购包装回收箱...
  6. 天弘余额宝发布2018年报:规模1.13万亿 平均每天赚1.39亿元
  7. Ubuntu 之旅(三)安装通讯工具
  8. gdal ImportError: DLL load failed
  9. MySQL 03-MySQL安装-直接解压二进制文件(CentOS6)
  10. python版代码整洁之道
  11. QCC3040---Media Player module
  12. Android-工作遭遇-URLConnection原生请求http和https忽略证书
  13. 帮我用js写一个微信聊天那种气泡效果
  14. 给oracle数据库现有表添加字段
  15. 学习笔记(02):【中国PHP教育大牛高洛峰】亲授php教程-PHP整型(integer)和浮点型(float或double)...
  16. 基于docker搭建l2tp
  17. gethostbyname和gethostbyaddr
  18. L1-002打印沙漏C语言,沙漏
  19. WordPress数据库文章表(字段说明)
  20. html文字居中对齐显示

热门文章

  1. c语言的输入函数有哪些
  2. 为什么C语言成了大学的必修课?
  3. 电脑无internet访问_电脑中的代理服务器怎么设置 代理服务器设置方法 - 操作系统...
  4. 宝塔面板php降级,宝塔面板6.8.8降级到5.9.1的方案教程
  5. hd-sdi转hdmi转换器产品规格参数及接口定义详解
  6. 【渝粤教育】国家开放大学2018年秋季 2726T畜禽生产概论 参考试题
  7. 建设IPTV电视系统是否有必要?
  8. 打印矩阵 java_【Java】 剑指offer(29) 顺时针打印矩阵
  9. linux 跟踪内存,用strace跟踪malloc内存分配
  10. 计算机组成原理,计算机系统概论,计算机基本组成