给定一个字符串S
,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab" 输出: "aba"
示例 2:
输入: S = "aaab" 输出: ""
基本思路:
- 首先算出每个字符出现的个数,若有一个字符出现超过全字符的一半以上,那么肯定不行。
- 根据出现的次数大到小,一次插空排列,既若a出现3次 b出现两次,那么a在0 2 4位置b在1 3位置。
- 返回结果即可。
class Solution {
public:
string reorganizeString(string S) {
int Max = 0, Len = S.size();
vector<LL> Hash(26);
string Res(Len, '0');
if (Len == 0)
return Res;
for (char C : S){
Hash[C - 'a'].C=C;
Hash[C - 'a'].Num++;
}
for (int i = 0; i<26; i++) Max = Max>Hash[i].Num ? Max : Hash[i].Num;
if ((Len + 1) / 2<Max)
return "";
sort(Hash.begin(), Hash.end(), Com);
int Index = 0;
for (int i = 0; i<26; i++) {
while (true) {
if (Hash[i].Num == 0)
break;
if (Index>=Len)
Index = 1;
Res[Index] = Hash[i].C;
Hash[i].Num--;
Index += 2;
}
}
return Res;
}
private:
struct LL {
int Num;
char C;
LL():Num(0),C('0'){}
};
static bool Com(LL& A, LL& B) {
return A.Num > B.Num;
}
};