透過將每個字元向右迴圈移動各自的頻率來修改字串


在這個問題中,我們需要根據給定字串中每個字元的頻率將其向右移動。為了解決這個問題,我們可以統計每個字元的頻率並將其儲存在陣列或對映等資料結構中。之後,我們可以使用字元的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 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告