构造思维学习指南
前置芝士
重构字符串
[problem description]
给定一个字符串 s
,检查是否能重新排布其中的字母,使得两相邻的字符不同。
返回 s
的任意可能的重新排列。若不可行,返回空字符串 ""
。
1 <= s.length <= 500
s
只包含小写字母
[solved]
[贪心+木桶思想]
1.将相同的字符放入不同的桶中以保证其彼此不会相邻,因此桶的数目应等于字符串中最多的元素的数目;
- 按贪心策略,优先填充数目最多的元素,对于每一种元素,循环在不同桶中进行填充,
由于桶的个数等于字符串中最多的元素的数目,因此每个桶中不会出现相同的元素,
填充完毕后将桶依次相连即为答案;
- 若填充完毕后长度为1的桶(只可能出现在最后的位置)的数目多于1,
将桶依次相连会使得这些长度为1的桶中的相同元素相邻,
说明不存在相应的排列,返回""
(这一情况即官解中说明的如果存在一个字母的出现次数大于(n+1)/2,其中n为字符串长度,
则无法重新排布字母使得相邻的字母都不相同)。