思路:画表格
具体细节:先统计出每个字符出现的个数,设最大数目为_max ,如果 n - _max <_max - 1直接return false。否则在行为_max的表格按照字符出现的个数由多到少一列一列填即可。
class Solution {
public:
bool cmp(const pair<char, int> &p1, const pair<char, int> &p2) {
return p1.second > p2.second;
}
string reorganizeString(string s) {
int n = s.size();
unordered_map<char, int> umap;
for (auto& ch : s) {
umap[ch]++;
}
vector<pair<char, int>> tmp(umap.begin(), umap.end());
sort(tmp.begin(), tmp.end(), cmp);
auto _max = tmp[0].second;
if (n - _max < _max - 1) return "";
vector<string> ans(_max);
int index = 0;
for (auto& each : tmp) {
for (int i = 0; i < umap[each.first]; ++i) {
ans[index].push_back(each.first);
index = (index + 1) % _max;
}
}
return accumulate(ans.begin(), ans.end(), string(""));
}
};
易错点:
1:不是次最多的个数小于最多的个数 return false,而是n - _max <_max - 1,因为后面的字符可以来填充第二列。
2:
accumulate(ans.begin(), ans.end(), string(""));
不能写成:accumulate(ans.begin(), ans.end(), "");