通过将每个字符按其频率循环右移来修改字符串

data structurec++server side programmingprogramming

在这个问题中,我们需要将给定字符串中的每个字符按其频率右移。为了解决这个问题,我们可以计算每个字符的频率,并将其存储在数组或映射等数据结构中。之后,我们可以使用字符的 ASCII 值,根据每个字符的频率右移。

问题描述- 给定一个包含小写字符且长度为 N 的字符串 str。我们需要将字符串中的每个字符右移,该字符的频率等于给定字符串中该特定字符的频率。

示例

输入– str = 'tutorialspoint'

输出– wvwqskbmtqqkow

解释

  • 't' 的频率为 3。因此,'t' + 3 = w。

  • 'u' 的频率为 1。因此,'u' + 1 = v

  • 'o' 的频率为 2。因此,'o' + 2 = q。

  • 'r' 的频率为 1。因此,'r' + 1 = s。

  • 'i' 的频率为 2。因此,'i' + 2 = k。

  • 'a' 的频率为 1。因此,'a' + 1 = b。

  • 'l' 的频率为 1。因此,'l' + 1 = m。

  • 's' 的频率为 1。因此,'s' + 1 = t。

  • 'p' 的频率为 1。因此,'p' + 1 = q。

  • 'n' 的频率为 1。因此,'n' + 1 = o.

输入 – str = 'xxxxyyyzz'

输出 – 'bbbbbbbbb'

解释

  • "x"的频率是 4。因此,'x' + 4 = b,因为我们需要进行循环移位。

  • "y"的频率是 3。因此,'y' + 3 = b。

  • "z"的频率是 4。因此,'z' + 2 = b。

方法 1

在此方法中,我们将使用 map 数据结构来计算并存储给定字符串中每个字符的频率。之后,我们可以遍历字符串并根据每个字符的频率对其进行循环移位。

算法

  • 定义"mp"map 来存储字符 ->频率

  • 定义"len"变量,并使用 length() 方法存储字符串的长度。

  • 使用 for 循环遍历字符串。在循环中,通过将当前值加 1 来更新字符的频率。

  • 现在,再次遍历字符串中的每个字符。

  • 在循环中,获取当前字符的频率,并对 26 进行模运算。将结果存储在"freq"变量中。这里,我们需要将字符右移 freq 的值,就像我们将字符右移 26 一样。

  • 如果 str[i] + freq 的 ASCII 值小于 z 的 ASCII 值,则将 str[i] 字符加上 freq 的值进行更新。

  • 否则,将 str[i] 的 ASCII 值加到 freq 中,并减去 z 的 ASCII 值。然后将结果加到 str[i] 中。

  • 返回最终字符串

示例

#include <iostream>
#include <map> 
//#include <set>
using namespace std;
// 函数将字符串中每个字符按其频率进行移位。
string shiftCharByFrequancy(string str){
   // 用于存储每个字符频率的映射
   map<char, int> mp;
   int len = str.length();
   // 遍历字符串
   for (int i = 0; i < len; i++){
      // 更新当前字符的频率
       mp[str[i]] += 1;
   }
   // 遍历字符串 str
   for (int i = 0; i < len; i++){
      // 获取当前字符的频率
      int freq = mp[str[i]] % 26;
      // 如果 str[i] + freq 的 ASCII 值小于或等于 'z' 的 ASCII 值,则通过添加 freq 来更新字符。
      if (str[i] + freq <= 'z'){
         str[i] = char(int(str[i]) + freq);
      } else {
         // 否则从 str[i] + freq 中减去 'z' 的 ASCII 值并将其添加到 'a' - 1 的 ASCII 值以获取更新的字符。
         freq = freq - 'z' + str[i];
         str[i] = char(int('a') + freq - 1);
      }
   }
   return str;
}
int main(){
   string str = "tutorialspoint";
   cout << "将字符串中的每个字符按其频率循环右移后的结果字符串是 " << shiftCharByFrequancy(str);
   return 0;
}

输出

将字符串中的每个字符按其频率循环右移后的结果字符串是 wvwqskbmtqqkow

时间复杂度 – O(N),因为我们遍历了长度为 N 的字符串。

空间复杂度 – (26) ~ O(1),因为我们使用 map 来存储字符的频率。

在本教程中,我们学习了如何根据每个字符的频率对其进行右移。我们使用 map 来存储频率,用户也可以使用数组或向量来存储频率。此外,count() 方法还可以用来计算特定字符的频率。


相关文章