通过删除频率不等于2的幂的字符后对字符进行排序来修改字符串

data structurec++programming

通过删除频率不等于2的幂的字符后对字符进行排序来修改字符串是计算机编程领域(尤其是在竞技编程领域)的一个常见问题。该问题要求输入一个字符串,并通过删除频率不等于2的幂的字符来修改字符串,然后按字典序递增的方式对剩余字符进行排序。

在本教程中,我们将使用 C++ 编程语言提供该问题的详细解决方案。我们将首先详细讨论问题陈述,探讨解决问题所涉及的各种复杂细节,然后提供如何使用 C++ 实现解决方案的分步指南。我们还将包含代码片段和示例来帮助说明所涵盖的概念。那么,让我们开始吧!

问题描述

给定一个包含"N"个字符串的数组"arr[]",任务是修改每个字符串,删除所有非2的幂次方的字符,然后按升序对数组进行排序,最后按降序对修改后的字符串进行排序。

示例

示例 1

例如,输入数组"arr[] = {"aaacbb", "bleek", "aaa"}"修改如下:

  • 字符串"aaacbb"中的"a"出现的频率不是2的幂次方。因此,从字符串中删除"a",得到"cbb"。修改后的字符串"cbb"按频率升序排序,与原始字符串相同。因此,"cbb"保持不变。

  • 字符串"bleek"的所有字符的频率都是2的幂。因此,没有删除任何字符,并且该字符串按频率升序排序,结果为"lkeeb"。

  • 字符串"aaa"中包含"a",其频率不是2的幂。因此,从字符串中删除"a",得到空字符串""。

最后,将修改后并排序的字符串连接在一起,得到输出"cbb lkeeb"

请注意,该程序假定输入字符串仅由小写英文字母组成。

示例 2

例如,如果输入数组为"S[] = {"c", "a", "b"}',程序按字母顺序对其进行排序,得到输出数组"S[] = {"a", "b", "c"}'。

算法

给定的问题可以使用哈希算法来解决,即存储每个字符串中字符的频率,然后执行指定的操作。按照以下步骤解决问题:

  • 遍历输入字符串数组 arr[],并对每个字符串执行以下操作:

    • 将每个字符的频率存储在 Map 中。

    • 创建一个空字符串 T,用于存储修改后的字符串。

    • 遍历 Map,并将频率为 2 的幂的字符附加到字符串 T。

    • 按频率升序对字符串 T 进行排序,并将其添加到字符串数组 res[] 中。

  • 按升序对数组 res[] 进行排序。

  • 完成上述步骤后,将数组 res[] 中的字符串打印为结果。

现在,让我们借助一个示例,理解上述算法在 C++ 中的实现。那就动手吧!

示例

上述算法的 C++ 实现

该程序首先将输入数组中每个字符串的每个字符的频率存储在哈希表中。然后,它修改每个字符串,只保留频率为 2 的幂的字符,并按降序对修改后的字符串进行排序。最后,它按升序对修改后的字符串进行排序并打印结果。

该程序的时间复杂度为 O(NMlog(M)),其中 N 是输入数组的大小,M 是输入数组中最长字符串的长度。这是因为,对于每个字符串,我们遍历一次以计算每个字符的频率,然后再遍历一次以修改字符串。排序操作的时间复杂度为 O(Mlog(M)),并且我们对每个字符串都执行此操作。此外,我们还会在最后对修改后的字符串进行排序,其时间复杂度为 O(NM*log(M))。

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <cmath>
using namespace std;
bool isPowerOfTwo(int n) {
    if (n == 0) {
        return false;
    }
    return (ceil(log2(n)) == floor(log2(n)));
}
void printArray(vector<string> res) {
    sort(res.begin(), res.end());
    cout << "Modified array= {";
    for (int i = 0; i < res.size(); i++) {
        cout << "\"" << res[i] << "\"";
        if (i != res.size() - 1) {
            cout << ", ";
        }
    }
    cout << "}" << endl;
}
void sortedStrings(string S[], int N) {
    unordered_map<char, int> freq;
    vector<string> res;
    for (int i = 0; i < N; i++) {
        string st = "";
        for (int j = 0; j < S[i].size(); j++) {
            freq[S[i][j]]++;
        }
        for (auto i : freq) {
            if (isPowerOfTwo(i.second)) {
                for (int j = 0; j < i.second; j++) {
                    st += i.first;
                }
            }
        }
        freq.clear();
        if (st.size() == 0) {
            continue;
        }
        sort(st.begin(), st.end(), greater<char>());
        res.push_back(st);
    }
    printArray(res);
}
int main() {
    string arr[] = { "aaacbb", "bleek", "aaa" };
    int N = sizeof(arr) / sizeof(arr[0]);
    cout << "Input array= {";
    for (int i = 0; i < N; i++) {
        cout << "\"" << arr[i] << "\"";
        if (i != N - 1) {
            cout << ", ";
        }
    }
    cout << "}" << endl;
    sortedStrings(arr, N);
    return 0;
}

输出

Input array= {"aaacbb", "bleek", "aaa"}
Modified array= {"cbb", "lkeeb"}

结论

总而言之,使用哈希技术可以高效地解决基于字符频率修改和排序字符串数组的问题。该解决方案的时间复杂度为 O(NM log M),其中 N 为字符串数量,M 为数组中最长字符串的长度。


相关文章