要求
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab"
输出: "aba"
示例 2:
输入: S = "aaab"
输出: ""
注意:
- S 只包含小写字母并且长度在[1, 500]区间内。
核心代码
class Solution:
def reorganizeString(self, s: str) -> str:
n = len(s)
stack = []
for k,c in sorted((s.count(x),x) for x in set(s)):
if k > (n + 1) / 2:
return ""
stack.extend([c] * k)
res = [None] * n
res[::2],res[1::2] = stack[n//2:],stack[:n//2]
return "".join(res)
解题思路:先统计所有字符各自的数量,按数量从大到小排列字符,若某个字符c的数量k超过总字符数的一半,必然不能达到要求,直接返回"",否则,将k个c存入stack中,这样就把所有相同的字符放在了相邻的位置,最后把stack中后一半字符放在偶数位,把前一半字符放在奇数位,构成新的字符串返回.