📅  最后修改于: 2023-12-03 15:42:06.309000             🧑  作者: Mango
给定一个仅包含小写字母的字符串,我们要将其重新排列,使得任意两个相邻的字符都不属于同一类型。如果这样的重新排列存在,则返回任意一种排列方式;否则,返回空字符串。
首先,我们需要统计字符串中每种字符出现的个数。可以使用一个哈希表来统计。键是字符,值是该字符在字符串中出现的次数。
根据统计结果,我们可以将字符按出现次数从大到小排序。排序后,我们将字符按照以下规则依次插入新字符串中:
例如,对于字符串 "aabbbc",统计出现次数后按发生次数从大到小排序为 "b -> a -> c",则依次插入新字符串中的顺序为 "b, a, b, a, c"。
如果新字符串中字符的数量与原字符串相同,则说明找到了能重新排列字符串的方式,返回新字符串。否则,返回空字符串。
以下是 Python 代码实现,时间复杂度 O(nlogn),空间复杂度 O(n)。
def reorganizeString(S: str) -> str:
# 统计字符出现次数
count = {}
for c in S:
count[c] = count.get(c, 0) + 1
# 按出现次数从大到小排序
chars = sorted(count.keys(), key=lambda x: count[x], reverse=True)
# 生成新字符串
new_str = []
while chars:
# 插入字符并更新计数
c = chars.pop(0)
new_str.append(c)
count[c] -= 1
# 如果还有该字符,则重新排序
if count[c] > 0:
chars.append(c)
chars = sorted(chars, key=lambda x: count[x], reverse=True)
# 如果新字符串中相邻字符相同,则返回空字符串
if len(new_str) > 1 and new_str[-1] == new_str[-2]:
return ""
return "".join(new_str)
测试样例 1:
输入: "aab"
输出: "aba"
测试样例 2:
输入: "aaab"
输出: ""
测试样例 3:
输入: "aaabc"
输出: "abaca"