358 Rearrange String k Distance Apart 每个相同字母都要相距为k 767. Reorganize String k = 2
Given a string s
and an integer k
, rearrange s
such that the same characters are at least distance k
from each other. If it is not possible to rearrange the string, return an empty string ""
.
Example 1:
Input: s = "aabbcc", k = 3
Output: "abcabc"
Explanation: The same letters are at least a distance of 3 from each other.
Example 2:
Input: s = "aaabc", k = 3
Output: ""
Explanation: It is not possible to rearrange the string.
Example 3:
Input: s = "aaadbbcc", k = 2
Output: "abacabcd"
Explanation: The same letters are at least a distance of 2 from each other.
Constraints:
1 <= s.length <= 3 * 105
s
consists of only lowercase English letters.0 <= k <= s.length
class Solution {
/**
和我的想法一样啊:从最多的开始放,abc abc ab ab a
用hashmap:可以,但是写起来不快
看来q也是一个常用的思路了
参考:https://leetcode.com/problems/reorganize-string/discuss/128907/Java-solution-99-similar-to-358
*/
public String rearrangeString(String S, int k) {
Map<Character, Integer> count = new HashMap<>();
for (char c : S.toCharArray()) {
count.put(c, count.getOrDefault(c, 0) + 1);
}
//所有的都加入到pq中
PriorityQueue<Character> maxHeap = new PriorityQueue<>((a, b) -> count.get(b) - count.get(a));
maxHeap.addAll(count.keySet());
//用于等待的q
Queue<Character> wait = new LinkedList<>();
//用于结果的sb
StringBuilder sb = new StringBuilder();
while(!maxHeap.isEmpty()) {
//拿出来一个频率最高的,数量-1,同时放到wait中
Character current = maxHeap.poll();
sb.append(current);
count.put(current, count.get(current) - 1);
wait.offer(current);
//一直在继续
if (wait.size() < k) {
continue;
}
//要是wait的第一个还有,就继续放进max heap
Character front = wait.poll();
if (count.get(front) > 0) {
maxHeap.offer(front);
}
}
return sb.length() == S.length() ? sb.toString() :"";
}
}