Leetcode 767. 重构字符串 Python3实现(超详细注释!)

Leetcode 767. 重构字符串 Python3实现

判断一个字符串能否通过重新排布其中的字母,使得两相邻的字符不同。加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!

class Solution:
    def reorganizeString(self, S: str) -> str:
        # 基于贪心的思想,当S中字母总数为偶数时,如果一个字母出现的次数最多不超过n/2时,我们可以用其他字母把该字母全部隔开;
        # 当S中字母总数为奇数时,如果一个字母出现的次数最多不超过(n+1)/2时,我们可以用其他字母把该字母全部隔开;
        # 其中n为偶数,n/2和(n+1)/2的结果是一样的,所以可以合并两种情况
        result = []
        # 为S中的所有字母计数
        counter = collections.Counter(S)
        # 基于上述理论,我们只需要找到次数出现最多的字母,判断其次数是否大于(n+1)/2,大于则不能使得两相邻的字符不同,小于则能
        if counter.most_common(1)[0][1] <= (len(S)+1)/2 :
            # 只要counter不为空,说明还有元素没有遍历完,一直遍历
            while counter:
                # tmp用来存储当前counter中次数出现最多的两个元素(counter中不足两个元素时,有多少存多少)
                tmp = []
                # 找到次数出现最多的两个元素(counter中不足两个元素时,有多少找多少)
                max_tow_ele = counter.most_common(2)
                # 遍历max_tow_ele中的元素,存入tmp
                for one in max_tow_ele:
                    tmp.append(one[0])
                # 将tmp存入result
                result.extend(tmp)
                # 将已经存入tmp的元素从counter中删除
                counter -= collections.Counter(tmp)
        # 两种情况:1)检查结果为不能重新排布其中的字母,使得两相邻的字符不同  -->  result为空列表,返回的是"";
        #          2) 检查结果为能重新排布其中的字母,使得两相邻的字符不同 -->  返回结果为一种可行的结果;
        return "".join(result)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值