题目描述:
给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。
所有输入的字符串都由小写字母组成,如果找不到距离至少为 k 的重排结果,请返回一个空字符串 “”。
示例 1:
输入: s = “aabbcc”, k = 3
输出: “abcabc”
解释: 相同的字母在新的字符串中间隔至少 3 个单位距离。
示例 2:
输入: s = “aaabc”, k = 3
输出: “”
解释: 没有办法找到可能的重排结果。
示例 3:
输入: s = “aaadbbcc”, k = 2
输出: “abacabcd”
解释: 相同的字母在新的字符串中间隔至少 2 个单位距离。
方法1:
主要思路:解题汇总
(1)先将原字符串的各个字符的数量进行统计;
(2)然后使用优先队列,将各个字符的数量和对应的字符压入到队列中,使用数量进行排序;
(3)使用贪心的思想,尽量先拍数量多的字符,每次从队列中取出 k 个元素,将其对应的字符放入到结果字符串中;
(4)这个过程中,需要判断当前要放入结果字符串的字符是否在当前位置之前的k个位置内出现过,若出现过,则直接返回空字符;
(5)若没有出现过,则将当前字符对应的数量减一,若此时数量仍不为0,则重新压入队列中;
(6)直到队列为空;
class Solution {
public:
string rearrangeString(string s, int k) {
if(k==0){
//处理特殊的情形
return s;
}
vector<int> counts(26