首頁 >後端開發 >C++ >加密字串

加密字串

王林
王林轉載
2023-09-08 10:37:021144瀏覽

加密字串

加密是一種透過使用某些技術或某些步驟來更改資料的技術,使其變更為另一種資訊或無法直接從中收集到先前的資訊。對於加密,我們必須遵循針對特定加密類型固定的某些步驟。

在這個問題中,我們將得到一個字串,我們必須按照給定的步驟對其進行加密 -

  • 首先,我們必須取得包含相同字符的所有子字串,並將該子字串替換為單個字符,後跟子字串的長度。

  • 現在,將長度變更為十六進位值,並且十六進位值的所有字元必須變更為小寫。

  • 最後,將整個字串反轉。

範例

Input 1: string str = "aabbbcccc"
Output: "4c3b2a"

說明

首先,我們將取得包含相同字元數的所有子字串,並將它們替換為字元的頻率,這將得到字串「a2b3c4」。現在我們將長度改為十六進位值,但 2、3 和 4 在十六進位形式中具有相同的值。最後我們將字串反轉,最終結果將是4c3b2a。

Input2: string str = "oooooooooooo"
Output: "co"

說明

首先,我們將字串轉換為頻率字串「o12」。現在,12的十六進制值為C,我們將其更改為小寫,即c,並將其替換到字串中,然後將字串反轉。

方法

從上面的例子中,我們對問題有了一個想法,現在讓我們進入實現部分 -

  • 在實作中,首先,我們將實作一個函數,將輸入作為整數,並傳回一個字串作為傳回值。

  • 此函數將用於將給定整數轉換為十六進位值,並進行一項修改,即使用小寫英文字母而不是大寫英文字元。

  • 我們將定義另一個函數,在該函數中,我們將使用for 循環遍歷字串,然後對於相同字元的子字串,我們將使用while 循環,直到找到與當前字元相等的字符。

  • 我們將計算頻率並將其變更為十六進位值並將其新增至具有目前索引字元的字串。

  • 最後,我們將字串反轉並返回主函數中列印。

範例

#include <bits/stdc++.h>
using namespace std;
// function to convert the integer to hexadecimal values 
string convertToHexa(int val){
   string res = ""; // string to store the result     
   while(val != 0){
      int cur = val %16; // getting the mode of the current value         
      if(cur < 10){
         res += '0' + cur;
       }
      else{
         res += 87 + cur; // adding 87 to get the lowercase letters 
      }
      val /= 16; // updating the current value 
   }
   return res;
}

// function to encrypt the string 
string encrypt(string str){
   int len = str.length(); // getting the length of the string 
   int freq = 0; // variable to store the frequency 
   string ans = ""; // string to store the answer    
   
   // traversing over the string 
   for(int i=0; i<len; i++){
      int j = i; // variable to keep track the substring with the same character
      while(j < len && str[j] == str[i]){
         j++;
      }
      freq = j-i;
      ans += str[i];
      
      // calling the function to get the hexadecimal value 
      string hexaValue = convertToHexa(freq);
      ans += hexaValue;        
      i = j-1;
   } 
   
   // reversing the string 
   reverse(ans.begin(), ans.end());
   return ans;
}

// main function 
int main(){
   string str = "aaabbbbccccccccccc"; // given string  
   
   // calling the function to get the encrypted string
   cout<<"The given string after the encryption is: "<<encrypt(str)<<endl;
   return 0;
}

輸出

The given string after the encryption is: bc4b3a

時間與空間複雜度

#上述程式碼的時間複雜度為 O(N),其中 N 是給定字串的大小。我們遍歷字串花了 N 時間,而反轉字串則比 N 時間少。

上述程式碼儲存最終字串的空間複雜度為 O(N),如果我們忽略這一點,則不會使用額外的空間。

注意

加密可以透過無限多種方式完成,並且只關心如何定義規則來加密金鑰。加密的主要特點是對於相同的輸入每次都必須給出相同的結果。

結論

在本教程中,我們實作了一個根據規則加密給定字串的程式碼,首先,我們必須取得包含相同類型元素的子字串,並將它們替換為字元及其頻率。下一步,我們將頻率更改為十六進制數字,最後將整個字串反轉。上述程式碼的時間複雜度為O(N)。

以上是加密字串的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除