358. K 距离间隔重排字符串

给你一个非空的字符串 s 和一个整数 k ,你要将这个字符串 s 中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离 至少 为 k 。如果无法做到,请返回一个空字符串 ""

示例 1:

输入: s = "aabbcc", k = 3
输出: "abcabc"
解释: 相同的字母在新的字符串中间隔至少 3 个单位距离。

示例 2:

输入: s = "aaabc", k = 3
输出: ""
解释: 没有办法找到可能的重排结果。

示例 3:

输入: s = "aaadbbcc", k = 2
输出: "abacabcd"
解释: 相同的字母在新的字符串中间隔至少 2 个单位距离。

提示:

  • 1 <= s.length <= 3 * 10^5
  • s 仅由小写英文字母组成
  • 0 <= k <= s.length

做题结果

成功,优先队列,滑动窗口都没用,就纯纯的排序+数组+集合(也可以不要,就纯数组也行)

方法:排序

1. 有长度为 n 的字符串,每k 个分为一组,可以分出 part=(n+k-1)组,那如果有字符数目超过part,一定无法构成模板串,直接返回

2. 字母用数组计数,记录每种字符的数量

3. 长度大于0的放入列表,按数量倒排

4. 每次取尽量数量多的 k 的字符,放入答案

5. 需要检查索引位置,如果和前面距离太近了,那就换同样数量的其他字母试试

6. 每次排一下顺序(只有长度26,所以一直排也没关系)

class Solution {public String rearrangeString(String s, int k) {if(k==0) return s;int[] arr = new int[26];int n = s.length();int part = (n+k-1)/k;//每部分最大几个for(int i = 0; i < n; i++){int index = s.charAt(i)-'a';arr[index]++;if(arr[index]>part){return "";}}//按数量顺序倒序List<int[]> list = new ArrayList<>();for(int i = 0; i < 26; i++){if(arr[i]>0){list.add(new int[]{i,arr[i]});//字母,数量}}//按数量倒排list.sort((a,b)->b[1]-a[1]);int[] lastId = new int[26];//上次的索引位Arrays.fill(lastId,-1);StringBuilder sb = new StringBuilder();boolean move = true;for(int i = 0; i < n&&move; ){move = false;//从数量多分配到数量少的for (int[] data : list) {//没得分跳出if (data[1] == 0) break;int id = sb.length();//距离不够远,跳过if(lastId[data[0]]!=-1 && id-lastId[data[0]]<k)continue;//本轮进行了操作move = true;lastId[data[0]] = id;sb.append((char) (data[0] + 'a'));--data[1];++i;//集齐k个本轮结束if (sb.length()%k==0) {break;}}//数量变化,重新排list.sort((a,b)->b[1]-a[1]);}return sb.length()==n?sb.toString():"";}}

358. K 距离间隔重排字符串 排序相关推荐

  1. LeetCode 358. K 距离间隔重排字符串(贪心+优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k. 所有输入的字符串都 ...

  2. POJ C++程序设计 编程题#7:字符串排序

    编程题#7:字符串排序 来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 总时间限制: 1000ms 内存限制: 1024k ...

  3. OpenJudge计算概论-字符串排序

    /*====================================================================== 字符串排序 总时间限制: 1000ms 内存限制: 6 ...

  4. java 英文字符串排序_英文字符串排序算法

    编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...

  5. Openjudge-计算概论(A)-字符串排序

    描述 参考整数排序方法,设计一种为字符串排序的算法,将字符串从小到大输出 输入 第一行为测试数据组数t, 后面跟着t组数据.每组数据第一行是n,表示这组数据有n行字符串,接下来是要排序的n行字符串.每 ...

  6. 按照拼音对数组中的中文字符串排序的算法

    按照拼音对数组中的中文字符串排序的算法,不是很难,这里直接放上代码,Demo去最下面找: 注:里面用到一个叫George的牛人写的中文转拼音首字母的函数pinyinFirstLetter,因为内容实在 ...

  7. 2019届vivo秋招笔试题【字符串排序】【链表奇数位正序偶数位逆序】【最长回文子串】

    字符串排序 1.题目描述 请对组字符串进行排序,字符串由大小写字母和数字组成,需要满足以下比较规则 1.长度不同时,长度较短在排前面 2.长度相同时,按照字典顺序排列(AaBb-Zz, 0-9顺序), ...

  8. LeetCode-791. 自定义字符串排序【哈希表,字符串,排序】

    LeetCode-791. 自定义字符串排序[哈希表,字符串,排序] 题目描述: 解题思路一:哈希表,我们首先遍历给定的字符串 order,将第一个出现的字符的权值赋值为 0,第二个出现的字符的权值赋 ...

  9. vivo2019秋招笔试真题 1.字符串排序 2.链表拆分 3.最长回文子串

    1.字符串排序 [题目描述]请对组字符串进行排序,字符串由大小写字母和数字组成,需要满足以下比较规则: 长度不同时,长度较短在排前面 长度相同时,按照字典顺序排列(AaBb-Zz, 0-9顺序),即大 ...

最新文章

  1. ReentrantLock+线程池+同步+线程锁
  2. MySQL 深入浅出索引(上)
  3. CMD指令收集(持续)
  4. 深度学习入门之PyTorch学习笔记
  5. tcpdump抓包分析具体解释
  6. lambda ::_Lambdas中的例外:有点混乱的优雅解决方案
  7. 大学生影视主题网页制作 银翼杀手2049电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
  8. 关于使用墙外安卓应用
  9. pyinstaller与anaconda python_python – 在Anaconda安装后运行pyinstaller导致ImportError:没有名为’pefile’的模块...
  10. css3的clip-path方法剪裁实现(三角形,多边形,圆,椭圆)
  11. 收集Tomcat异常日志并发送邮件
  12. (转贴)正则表达式学习心得体会(1)
  13. VSTO入门学习笔记5-数组
  14. PEPS 无钥匙进入系统低频芯片 PCF7991 介绍
  15. 最新【2021.1.28】今日头条_signature 分析
  16. 最美证件照工作室需要买什么东西
  17. Python之pyc文件作用及生成方法
  18. error怎么开机 fan_电脑开机后显示CPU Fan Error错误提示怎么办?分享六种解决方法...
  19. g代码生成器 源代码_如何生成源代码?
  20. 由一道bash jail题引出的琐事@_@

热门文章

  1. 使用“soup.h1.text”爬虫提取标题会多一个\
  2. python自动抢单_【Python成长之路】基于sikuli jar包,实现淘宝自动抢单功能(1)...
  3. 修改MP4文件二进制内容,实现安卓Camera2旋转录制视频画面功能
  4. 加mp4文件后js失效_video不能播放mp4的问题(一)
  5. 超硬核Python避坑学习方案奉上!入门到就业一篇就搞定!
  6. 霍金门徒:计算机如何比人更懂世界
  7. 2019.3.9 提高B组 T1 JZOJ 4742 单峰
  8. QT-简单的CNC控制面板
  9. python在数据分析方面的应用-数据分析应用方面Python和spss有什么区别?
  10. 护理学跨考计算机专业,什么是跨专业考研?