leetcode_767 重构字符串

111 阅读1分钟

要求

给定一个字符串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)

image.png

解题思路:先统计所有字符各自的数量,按数量从大到小排列字符,若某个字符c的数量k超过总字符数的一半,必然不能达到要求,直接返回"",否则,将k个c存入stack中,这样就把所有相同的字符放在了相邻的位置,最后把stack中后一半字符放在偶数位,把前一半字符放在奇数位,构成新的字符串返回.