重新排列給定的字串,使所有質數倍數指標具有相同字元


字串是一系列字元、數字、字母數字字元和特殊字元。字串的長度是其中包含的字元數。質數是隻能被 1 和自身整除的數。

在這篇文章中,我們給出了一個長度為 n 的示例輸入字串。我們將開發一個程式碼,其思想是在任意位置 p 替換相同的字元,以便從 1 到 n/p 範圍內的字元位置重合。

下面是一些說明問題陳述的示例 −

示例示例

示例 1 - alphaaa

輸出 - haaalap

解釋 - 質數索引 2、4、6 和索引 3、6 包含相同的字元“a”。

示例 1 - alphaa

輸出 - -1

解釋 - 只要我們從字串中減少一個字元“a”,所有必需的

位置不能容納相同的字元。因此,返回的輸出是 -1。

演算法

  • 步驟 1 − 初始化一個對映來記錄字串中出現的字元數。

  • 步驟 2 − 地圖包含一個型別元組用於儲存字元及其各自的頻率。

  • 步驟 3 − 每次遇到一個字元時,它的頻率都會增加 1。

  • 步驟 4 − 向量 vec 也被初始化以保持反向形式的地圖條目,性質如下:其中將計數和與其關聯的相應字元推入向量。

  • 步驟 5 − 然後對向量進行排序,以便按其頻率對字元進行排序。

  • 步驟 6 − 位置陣列 pos 宣告為與可能的最大值等效的大小。

  • 步驟 7 − 使用 C++ STL 中提供的 fill() 方法對其初始化為值 1。

  • 步驟 8 − 使用指標 i,從整數值 2 開始啟動字串的迭代,如果此位置的 pos 陣列包含一個值,那麼使用指標 j 評估所有素數倍數。

  • 步驟 9 − 對於所有有效位置,填充有相同字元的位置的計數器都會遞增。

  • 步驟 10 − 否則,評估 i*j 索引的 pos 值。

  • 步驟 11 − 然後儲存出現次數最多的字元的頻率,把它認為是很多。

  • 步驟 12 − 如果佔用的位置數大於出現最多的字元頻率,則返回 -1,因為這是一個不可能的操作。

  • 步驟 13 − 否則,最初所有素數倍數索引(即理想位置)都由出現次數最多的字元填出。

  • 步驟 14 − 然後填充剩餘位置。

  • 步驟 15 − 每次從向量中取出一個字元並填充在剩餘位置。

  • 步驟 16 − 此字元的頻率遞減。

  • 步驟 17 − 當某個特定字元的所有出現都被用完時,則從向量中獲取下一個字元。

  • 步驟 18 − 最後交換字元後列印輸出陣列字串。

示例

以下 C++ 程式碼片段採用一個示例輸入字串,然後將相同字元(如果可能)放入所有素數倍數索引中。

//including the required libraries
#include <bits/stdc++.h>
using namespace std;

//rearranging prime indexes to store same character
void primeindx(string str){

   // To store the result after transformation
   char res[100005];
   int pos[100005];

   //calculating the size of string
   int len = str.size();

   //counter of same elements
   int cnt = 0;

   //maintaining map to store the number of occurrences of characters in string
   map<char, int> map;
   for (auto ch : str){

      //incrementing count of character
      map[ch]+=1;
   }

   //maintaining a vector to store the different characters in map and their respective counts to sort them according to the frequency
   vector<pair<int, char> > vec;
   for (auto entry : map)
   vec.push_back({ entry.second, entry.first });

   //sorting the vector according to the frequencies
   sort(vec.begin(), vec.end());

   //fill the positions of the array pos with 1
   fill(pos + 1, pos + len + 1, 1);

   //storing indices correctly in the pos array
   for (int i = 2; i <= len / 2; i++) {

      //check if the value at pos[i] is equivalent to 1
      if (pos[i]) {

         //getting all multiples of i
         for (int j = 1; i*j<= len; j++) {
            int val = i*j;
            if (pos[val])

               //incrementing the number of same characters is value is contained in the multiple
               cnt++;

            //else storing 0 in the pos vector at that position
            pos[val] = 0;
         }
      }
   }

   //getting the occurrence of the character occurring the maximum number of times
   int mch = vec.back().first;
   if ( mch < cnt) {

      //not possible
      cout << -1;
      return;
   }
   for (int i = 2; i <= len; i++) {
      if (!pos[i]) {

         //storing the character at the prime indexes is the count of the same character satisfies
         res[i] = vec.back().second;
      }
   }

   //fetching characters after prime indexes have been filled out
   int k = 0;
   for (int i = 1; i <= len; i++) {

      //if ith index contains 1
      if (pos[i]) {

         //get the character in the result array
         res[i] = vec[k].second;

         //decrement the count available for the character that has been substitutes
         vec[k].first-=1;

         //if there are no more occurrences of that particular character, skip to next one
         if (vec[k].first == 0)
         k++;
      }
   }

   //printing the final result array
   for(int i =1;i<=len;i++){
      cout << res[i];
   }
}
//calling the main method
int main(){

   //declaring a sample string
   string str = "codeeee";

   //prime multiple indexes arrangement of character
   primeindx(str);
   return 0;
}

輸出

ceeedeo

結論

字元計數是 C++ 字串的一個重要方面。基於字串中可用的字元頻率,可以做出大量決策。對映是儲存資料對的一種有效方式,例如字元及其各自的計數,並且非常直觀。

更新日期:15-Mar-2023

107 次檢視

開啟你的 職業生涯

完成課程獲得認證

開始學習
廣告