LeetCode 767. 秒懂重构字符串

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。

例子:
输入: S = “aab”
输出: “aba”

难点分析:

  • 如何断定是否可构
  • 若可构,如何贪心排列

思路:
如何断定是否可构:对于任何一种字符,从自身角度看,仅分为同种和不同种。所以只要每种字符都不大于长度的一半(奇数个时,入ababa,向上取整),变可重构

如何贪心排列:总是将数量最多元素优先散列开来。
将数量由多到少的同种元素,依次先放到奇数位,当奇数位满后,在排满偶数位
(之所以先按奇数位散开,因为奇数位总是>=偶数位,例如 aaabb)

代码:

class Solution:
    def reorganizeString(self, S: str) -> str:
        d=Counter(S)
        if d.most_common()[0][1]>ceil(len(S)/2):
            return ''
        n=0
        l=[0]*len(S)
        for i,j in d.most_common():
            for k in range(j):
                l[n]=i
                n=(n+2)%len(S)
                if n==0:
                    n+=1
        return ''.join(l)

注意:当len(S),为奇数时,n=(n+2)%len(S)会遍历每一个位
但当len(S)为偶数时,n=(n+2)%len(S),会重复跳回0,为防止此类情况发生,加判断

                if n==0:
                    n+=1

附加:贪心算法二(来自力扣——python2019)
将字符按字符数排序。
如果最多的字符占了半数以上,返回空,
如果总字符数是偶数,将排序后的字符分为前后两半,交叉得出结果
如果为奇数,将前后两半交叉,再加上最中间的字符。

你可能感兴趣的:(贪心算法)