leetcode-master/problems/0767.重构字符串.md

2.6 KiB
Raw Blame History

如果对做了一些题目,对字符串还没有整体了解的话,可以看这篇:字符串经典题目大总结!,相信字符串各种操作就非常清晰了。

扫了一圈题解,感觉大家的解答都比较高端,我来一个朴实无华的版本。

分为如下三步:

  • 用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%了。 767. 重构字符串

我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在公众号:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

如果感觉题解对你有帮助,不要吝啬给一个👍吧!