给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
leetcode

解题思路:

  • 首先想想什么样的情况下不能构成可行的字符串,就像植树问题,最大的相同的字符个数一定小于字符串长度加一再除以二,如果超了就肯定会相邻。
  • 所以,我们在枚举输出的时候,只要剩下需要输出的字符串一直满足这个条件,就一直能够产生合法的答案。当我们每次输出数量最大的两个字符串的时候,就能够让原来的字符串一直满足条件了。你想嘛,如果每次都输出数量的了,那么数量大的不就肯定会超过半数了。
    这里利用了优先队列,让数量多的字符排在对头。
class Solution {public String reorganizeString(String s) {int n = s.length();if(n < 2) return s;// 通过数组对字符串的字符进行计数int[] cnt = new int[26];int maxCnt = 0;for(char c : s.toCharArray()) {cnt[c - 'a'] ++;}for(int i : cnt) {maxCnt = Math.max(maxCnt, i);}if(maxCnt > (n + 1) / 2) return "";// 构造优先队列PriorityQueue<Character> q = new PriorityQueue<>((a, b) -> cnt[b - 'a'] - cnt[a - 'a']);// 填入优先队列for(int i = 0; i < 26; i++) {if(cnt[i] > 0) q.offer((char)(i + 'a'));}StringBuilder res = new StringBuilder();while(q.size() > 1) {// 每次提取两个数量最多的字符char a = q.poll();char b = q.poll();res.append(a);res.append(b);cnt[a - 'a'] --;cnt[b - 'a'] --;if(cnt[a - 'a'] > 0) q.offer(a);if(cnt[b - 'a'] > 0) q.offer(b);}// 最后可能还剩下一个if(q.size() > 0) res.append(q.poll());return res.toString();}
}

算法——重构字符串使得相邻字符不同相关推荐

  1. 【字符串处理算法】最长连续字符及其出现次数的算法设计及C代码实现

    一.需求描述 输入一个字符串,编写程序找出这个字符串中的最长连续字符,并求出其连续出现的次数. 例如,"123444445"中的最长连续字符是4,其连续出现的次数为5:" ...

  2. 【小米笔试题】实现一个算法,确定一个字符串的所有字符是否全部不同

    实现一个算法,确定一个字符串的所有字符是否全部不同. 下面给出3种可行方法,都经过测试.(其中方法一,刚开始理解有些困难,需要多思考一下) package XiaoMi;import java.uti ...

  3. C语言编程>第二十三周 ③ 下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三字符插入

    例题:下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序.插入法的基本算法是:先对字符串中的头两个元素进行排序:然后把第三字符插入到前两个字符中,插入后前三个字 ...

  4. 777. 在LR字符串中交换相邻字符

    777. 在LR字符串中交换相邻字符 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"L ...

  5. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

    请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...

  6. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代

    请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...

  7. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构

    **请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,Fals ...

  8. 【面试经典题之字符串】实现一个算法,确定一个字符串的所有字符是否全都不同。假设不允许使用额外的数据结构

    实现一个算法,确定一个字符串的所有字符是否全都不同.假设不允许使用额外的数据结构. 解题: 首先我们假设这个字符串中全都是ASCII字符(如果不是需要另外讨论了).因为ASCII字符集中总共有256个 ...

  9. 实现一个算法,确定一个字符串的所有字符是否全都不同?

    实现一个算法,确定一个字符串的所有字符是否全都不同? 解法 Python算法实现 代码测试 解法 构建一个布尔值的数组,索引值i对应的标记指示该字符串是否含有字母表第i个字符.若这个字符第二次出险,则 ...

  10. Java实现 LeetCode 777 在LR字符串中交换相邻字符(分析题)

    777. 在LR字符串中交换相邻字符 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"L ...

最新文章

  1. 超级队长VR线下体验店落地上海,让娱乐突破想象
  2. PowerShell2.0之Windows排错(一)启动故障排错
  3. Spring Boot实现监控linux-cpu和内存使用情况,并发送邮件
  4. 《玩转微信6.0》一1.2 微信初体验
  5. 小师妹学JavaIO之:NIO中那些奇怪的Buffer
  6. 如何知道一个域名是否存在_域名检测API实现查看一个域名在微信中是否被封
  7. ajax同步和异步的区别_同步电机和异步电机区别
  8. 使用node中的express解决vue-cli加载不到dev-server.js的问题
  9. 客户端用java api 远程操作HDFS以及远程提交MR任务(源码和异常处理)
  10. [IE编程] IE8的SDK 下载
  11. Linux--vmlinuz、vmlinux、initrd
  12. BT656跟BT1120和BT709有什么区别
  13. 此beta版已额满_《魔域口袋版》福利狂欢:现金红包天天送 魔石神器免费拿
  14. 瑞萨开发板编译和烧录
  15. 1.1 项目经理是干什么的
  16. 短信验证码被盗刷了怎么办?
  17. ATTCK靶场系列(七)
  18. WWW相关概念的学习
  19. 修改vscode终端字体
  20. 主机屋免费服务器 – 真的开启服务器免费时代?

热门文章

  1. WPF3D贴图:用C#搓一个地球
  2. qlv转MP4(笨方法,大用途)
  3. 什么邮箱最好用?主流邮箱品牌如何选择
  4. Android编程制作漫画,画出自己的漫画 Android漫画风制作所
  5. 荷兰版《口袋妖怪GO》:不找小精灵,找免费啤酒!
  6. 一道关于SVM的机器学习作业题
  7. mac ruby 环境变量_Ruby环境设置| 在Mac和Windows操作系统上安装Ruby
  8. 节理玫瑰花图怎么画,节理玫瑰花图和地质图.ppt
  9. 【sv】局部数据存储: 自动存储vs静态存储
  10. NLP 语义匹配:经典前沿方案整理