难度:★★★☆☆
类型:字符串
方法:贪心算法
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
给定一个字符串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解决方案,请移步力扣中等题解析
网友评论