2.6 KiB
2.6 KiB
如果对做了一些题目,对字符串还没有整体了解的话,可以看这篇:字符串经典题目大总结!,相信字符串各种操作就非常清晰了。
扫了一圈题解,感觉大家的解答都比较高端,我来一个朴实无华的版本。
分为如下三步:
- 用map统计频率字符频率
- 转为vector(即数组)按频率从大到小排序
- 按奇数位顺序插入,插满之后按偶数位顺序插入
为什么要先按奇数位插入呢?
先按奇数位插入,保证最大的字符分散开,因为奇数位总是>=偶数位!
C++代码如下:
class Solution {
private:
bool static cmp (const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second; // 按照频率从大到小排序
}
public:
string reorganizeString(string S) {
unordered_map<char, int> umap;
int maxFreq = 0;
for (char s : S) {
umap[s]++;
maxFreq = max(umap[s], maxFreq);
}
if (2 * maxFreq - 1 > S.size()) return "";
vector<pair<int, int>> vec(umap.begin(), umap.end());
sort(vec.begin(), vec.end(), cmp); // 给频率排个序
string result(S);
int index = 0;// 先按奇数位散开
for (int i = 0; i < vec.size(); i++) {
while (vec[i].second--) {
result[index] = vec[i].first;
index += 2;
if (index >= S.size()) index = 1; // 奇数位插满了插偶数位
}
}
return result;
}
};
- 时间复杂度O(nlogn)
- 空间复杂度O(n)
关于leetcode统计的击败多少多少用户,大家不必过于在意,想好代码的时间复杂度就够了,这个击败多少用户,多提交几次可能就击败100%了。

我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在公众号:代码随想录,关注后就会发现和「代码随想录」相见恨晚!
如果感觉题解对你有帮助,不要吝啬给一个👍吧!