358. Rearrange String k Distance Apart
Rearrange String k Distance Apart
Last updated
Rearrange String k Distance Apart
Last updated
public class Solution {
public String rearrangeString(String str, int k) {
Map<Character, Integer> map = new HashMap<>();
for (Character c : str.toCharArray()) {
map.merge(c, 1, (a, b) -> a + b);
}
List<Result> results = new ArrayList<>();
for (Character c : map.keySet()) {
results.add(new Result(c, map.get(c)));
}
Collections.sort(results, (a, b) -> b.count - a.count);
// check k one by one
int size = str.length();
int count = results.get(0).count;
if ((count - 1) * k + 1 > size) {
return "";
}
size -= count;
List<StringBuffer> buckets = new ArrayList<>();
for (int i = 0; i < count; i++) {
buckets.add(new StringBuffer().append(results.get(0).ch));
}
k -= 1;
int runner = 0;
for (int i = 1; i < results.size(); i++) {
if (count != results.get(i).count) {
runner = 0;
}
count = results.get(i).count;
if ((count - 1) * k + 1 > size) {
return "";
}
for (int j = 0; j < count; j++) {
buckets.get(runner).append(results.get(i).ch);
runner += 1;
runner %= buckets.size();
}
k -= 1;
size -= count;
}
return buckets.stream().reduce(new StringBuffer(), (a, b) -> {
a.append(b);
return a;
}).toString();
}
private class Result {
char ch;
int count;
public Result(char ch, int count) {
this.ch = ch;
this.count = count;
}
}
}