给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab"
输出: "aba"
示例 2:
输入: S = "aaab"
输出: ""
本题采用贪心算法和堆来求解。
我们尽可能向构造的字符串中加入剩余数量多的字符,这样避免剩余过多的单一字符,最后
相邻。
每次选出剩余最多的两个字符就可以避免和以构造的字符串末尾同。
import heapq
from collections import Counter
class Solution:
def reorganizeString(self, S: str) -> str:
if len(S) < 2:
return S
c2cnt = Counter(S)
que = [(-c2cnt[c], c) for c in c2cnt]
# 维护一个堆
heapq.heapify(que)
res = ''
while len(que) >= 2:
cnt1, c1 = heapq.heappop(que)
cnt2, c2 = heapq.heappop(que)
if not res:
res = c1 + c2
elif res[-1] == c1:
res += (c2 + c1)
else:
res += (c1 + c2)
if -cnt1 > 1:
heapq.heappush(que, (cnt1 + 1, c1))
if -cnt2 > 1:
heapq.heappush(que, (cnt2 + 1, c2))
if len(que) == 1:
if -que[0][0] > 1:
return ''
res += que[0][1]
return res