在C ++中重新排列字符串k距离
假设我们有一个非空字符串s和一个整数k;我们必须重新排列字符串,以使相同字符之间的距离至少为k。给定的字符串以小写字母表示。如果没有办法重新排列字符串,那么我们将得到一个空字符串。
因此,如果输入类似于s=“aabbcc”,k=3,则输出将为“abcabc”,这是因为相同的字母彼此之间的距离至少为3。
为了解决这个问题,我们将遵循以下步骤-
ret:=一个空字符串
定义一张映射
n:=s的大小
对于初始化i:=0,当i<n时,更新(将i增加1),执行-
(将m[s[i]]增加1)
定义一个优先级队列pq
对于在m中的每个键值对,执行-
temp:=有键和键值的一对
将温度插入pq
(增加1)
定义一个双端队列dq
虽然(不是pq为空),但是-
curr:=dq的第一个元素
从dq中删除前元素
如果curr.second>0,则-
将curr插入pq
curr:=pq的顶部
从pq中删除元素
ret:=ret+curr.first
(将秒数减少1)
在dq的末尾插入curr
如果dq的大小>=k,则-
虽然(不是dq为空,并且dq的第一个元素等于0),但请执行以下操作-
从dq中删除前元素
返回(如果dq为空,则返回,否则为空字符串)
例
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
struct Comparator {
bool operator()(pair<char, int> a, pair<char, int> b) {
return !(a.second > b.second);
}
};
class Solution {
public:
string rearrangeString(string s, int k) {
string ret = "";
unordered_map<char, int> m;
int n = s.size();
for (int i = 0; i < n; i++) {
m[s[i]]++;
}
unordered_map<char, int>::iterator it = m.begin();
priority_queue<pair<char, int<, vector<pair<char, int>>,
Comparator> pq;
while (it != m.end()) {
pair<char, int> temp = {it->first, it->second};
pq.push(temp);
it++;
}
deque<pair<char, int>> dq;
while (!pq.empty()) {
pair<char, int> curr = pq.top();
pq.pop();
ret += curr.first;
curr.second--;
dq.push_back(curr);
// cout << ret << " " << dq.size() << endl;
if (dq.size() >= k) {
curr = dq.front();
dq.pop_front();
if (curr.second > 0)
pq.push(curr);
}
}
while (!dq.empty() && dq.front().second == 0)
dq.pop_front();
return dq.empty() ? ret : "";
}
};
main() {
Solution ob;
cout << (ob.rearrangeString("aabbcc", 3));
}输入值
"aabbcc", 3
输出结果
bacbac