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)