构造思维学习指南

前置芝士

重构字符串

[problem description]

给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。

返回 s 的任意可能的重新排列。若不可行,返回空字符串 ""

1 <= s.length <= 500

s 只包含小写字母

[solved]

[贪心+木桶思想]

1.将相同的字符放入不同的桶中以保证其彼此不会相邻,因此桶的数目应等于字符串中最多的元素的数目;

  1. 按贪心策略,优先填充数目最多的元素,对于每一种元素,循环在不同桶中进行填充,

由于桶的个数等于字符串中最多的元素的数目,因此每个桶中不会出现相同的元素,

填充完毕后将桶依次相连即为答案;

  1. 若填充完毕后长度为1的桶(只可能出现在最后的位置)的数目多于1,

将桶依次相连会使得这些长度为1的桶中的相同元素相邻,

说明不存在相应的排列,返回""

(这一情况即官解中说明的如果存在一个字母的出现次数大于(n+1)/2,其中n为字符串长度,

则无法重新排布字母使得相邻的字母都不相同)。

posted @ 2023-10-19 15:24  White_Sheep  阅读(12)  评论(0编辑  收藏  举报