给定一个字符串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)
将字符按字符数排序。
如果最多的字符占了半数以上,返回空,
如果总字符数是偶数,将排序后的字符分为前后两半,交叉得出结果
如果为奇数,将前后两半交叉,再加上最中间的字符。