对字符串数组进行排序,先移除频率不是2的幂的字符,再对每个字符串排序


在这个问题中,我们需要移除字符串中频率不是2的幂的字符。之后,我们需要按照非递减顺序对数组中的每个字符串进行排序。

问题陈述 - 我们给定一个包含 N 个不同长度字符串的数组 arr[]。如果字符的频率不是2的幂,则需要移除字符串中的字符。之后,需要对每个字符串进行排序。

示例

输入 – arr[] = {"abde", "cpcc", "ddddd", "kk"}

输出 – edba, p, kk

解释

  • 在字符串“abde”中,所有字符的频率都是1,等于 2^0。

  • 在字符串“cpcc”中,“c”的频率是3,它不等于任何2的幂。所以,我们移除了它。

  • 在字符串“ddddd”中,“d”的频率是5。所以,所有字符都被从字符串中移除。

  • 在字符串“kk”中,“k”的频率是2,等于 2^1。

最后,我们按照递减顺序对所有字符串进行排序,并显示非空字符串。

输入 – arr[] = {"yz ", "nm", "", ""}

输出 – zy, mn

解释 – 它在输出中移除空字符串。

方法 1

在这个方法中,首先,我们将计算给定字符串中每个字符的频率。之后,我们将检查频率是否为2的幂。如果是,我们将保留字符串中的字符。否则,我们将从字符串中移除它。

用户可以按照以下算法解决问题。

算法

  • 定义 isPowerOfTwo() 函数来检查数字是否为2的幂。

    • 在函数中,如果“num”等于零,则返回 false。

    • 取以2为底的对数。

    • 如果 num 是 2 的幂,则取对数时得到整数值。因此,使用 ceil() 和 floor() 方法来检查对数值是否为整数,并根据此返回布尔值。

  • 定义 sortedString() 函数来对修改后的字符串进行排序。

  • 定义“freq”映射来存储特定字符串的字符频率。此外,定义“ans”向量来存储结果字符串。

  • 使用循环遍历字符串数组。在循环中,定义“temp”字符串变量并将其初始化为空字符串。

  • 现在,使用循环遍历从第 i 个索引开始的字符串,并将字符的频率存储在“freq”映射中。

  • 2的幂。如果是,则将字符频率次添加到 temp 字符串中。

  • 使用 clear() 方法清除映射,因为我们需要存储另一个字符串的字符频率。

  • 如果“temp”字符串的大小为零,则继续迭代。

  • 使用 sort() 方法对字符串进行排序,并将其附加到“ans”向量。

  • 遍历“ans”向量以获取所有结果字符串。

示例

#include <iostream>
#include <vector>
#include <unordered_map>
#include <cmath>
#include <algorithm>
using namespace std;

// Check whether Num is power of 2
bool isPowerOfTwo(int num){
   // Base Case
   if (num == 0)
      return false;
   // If num is a power of 2, then log2(num) will be an integer value.
   return (ceil(log2(num)) == floor(log2(num)));
}
// function to modify the array of strings according to the given condition.
void sortedStrings(string str[], int N){
   // map to store the frequency of each alphabet of the string.
   unordered_map<char, int> freq;
   // storing answer in a vector of strings.
   vector<string> ans;
   // iterate over the array of strings
   for (int i = 0; i < N; i++){
      // Temporary string
      string temp = "";
      // Stores frequency of each
      // alphabet of the string
      for (int j = 0; j < str[i].size(); j++){
         // Update frequency of str[i][j]
         freq[str[i][j]]++;
      }
      // Iterate over the map
      for (auto i : freq){
         // If the frequency of any alphabet is a power of 2, then append it to temp.
          if (isPowerOfTwo(i.second)){
             // append i.first character i.second times to temp.
             for (int j = 0; j < i.second; j++){
                 temp += i.first;
             }
          }
      }
      // Clear the map
      freq.clear();
      // empty string
      if (temp.size() == 0)
         continue;
      // sort the string in non-increasing order
      sort(temp.begin(), temp.end(), greater<char>());
      // push temp string to ans
      ans.push_back(temp);
   }
   // Print the array of strings
   cout << "The array of strings after modification is: ";
   for (int i = 0; i < ans.size(); i++){
      cout << ans[i] << " ";
   }
}
int main(){
   string arr[] = {"abde", "cpcc", "ddddd", "kk"};
   int N = sizeof(arr) / sizeof(arr[0]);
   sortedStrings(arr, N);
   return 0;
}

输出

The array of strings after modification is: edba p kk 

时间复杂度 – O(N*M),其中 N 是数组的长度,M 是字符串的最大长度。

空间复杂度 – O(N),用于在映射中存储字符频率。

我们学习了如何从字符串中移除所有频率不等于2的幂的字符,并按照递减顺序对字符串进行排序。程序员可以尝试按照字符的频率顺序对字符串的字符进行排序。

更新于:2023年8月10日

93 次查看

开启你的职业生涯

完成课程获得认证

开始学习
广告