通过将每个字符向右循环移动各自的频率来修改字符串


在这个问题中,我们需要根据给定字符串中每个字符的频率将其向右移动。为了解决这个问题,我们可以统计每个字符的频率并将其存储在数组或映射等数据结构中。之后,我们可以使用字符的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’的频率是2。所以,‘z’ + 2 = b。

方法1

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

算法

  • 定义映射 ‘mp’ 来存储字符 -> 频率

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

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

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

  • 在循环中,访问当前字符的频率并执行模26运算。将结果存储在变量 ‘freq’ 中。在这里,我们需要根据 ‘freq’ 值对字符执行右移操作,因为如果我们将字符右移26位,我们将得到相同的结果

  • 如果 str[i] + freq 的ASCII值小于 ‘z’ 的ASCII值,则通过添加 ‘freq’ 值来更新 str[i] 字符

  • 否则,将 str[i] 的ASCII值添加到 ‘freq’ 并减去 ‘z’ 的ASCII值。之后,将结果值添加到 str[i]。

  • 返回最终字符串

示例

#include <iostream>
#include <map> 
//#include <set>
using namespace std;
// Function to shift each character of the string by its frequency.
string shiftCharByFrequancy(string str){
   // map to store the frequency of each character
   map<char, int> mp;
   int len = str.length();
   // Iterate over the string
   for (int i = 0; i < len; i++){
      // update the frequency of the current character
       mp[str[i]] += 1;
   }
   // Traverse the string str
   for (int i = 0; i < len; i++){
      // get the frequency of the current character
      int freq = mp[str[i]] % 26;
      // If the ASCII value of str[i] + freq is less than or equal to the ASCII value of 'z', then update the character by adding freq.
      if (str[i] + freq <= 'z'){
         str[i] = char(int(str[i]) + freq);
      } else {
         // else subtract ASCII value of 'z' from str[i] + freq and add it to ASCII value of 'a' - 1 to get the updated character.
         freq = freq - 'z' + str[i];
         str[i] = char(int('a') + freq - 1);
      }
   }
   return str;
}
int main(){
   string str = "tutorialspoint";
   cout << "The resultant string after circularly right shifting each character of string by its frequency is " << shiftCharByFrequancy(str);
   return 0;
}

输出

The resultant string after circularly right shifting each character of string by its frequency is wvwqskbmtqqkow

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

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

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

更新于:2023年8月10日

96 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告