767. 重构字符串(Python)

难度:★★★☆☆
类型:字符串
方法:贪心算法

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:

输入: S = "aab"
输出: "aba"

示例 2:

输入: S = "aaab"
输出: ""
注意:

S 只包含小写字母并且长度在[1, 500]区间内。

解答

判断能否获得不相邻的排布是很容易的,只需要统计每个字符出现的次数,最大的次数不超过字符串全长度的一半即可满足要求,重点在于如何寻找到这样一个排布。

我们用贪心算法来解决这个问题,将字符串及其出现次数的字典按照出现次数降序排列,命名为total,然后按照奇偶分开,从前到后逐个插空安放total中的元素即可。

from collections import Counter
class Solution:
    def reorganizeString(self, S: str):
        counter = Counter(S)
        if max(counter.values()) > (len(S) + 1) // 2:
            return ''
        total = ''.join(c * v for c, v in sorted(counter.items(), key=lambda x: x[1], reverse=True))
        new_string = [''] * len(S)
        for i, j in enumerate(list(range(0, len(S), 2)) + list(range(1, len(S), 2))):
            new_string[j] = total[i]
        return ''.join(new_string)

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

你可能感兴趣的:(767. 重构字符串(Python))