加密是一种通过使用某些技术或某些步骤来更改数据的技术,使其更改为另一种信息或无法直接从中收集到先前的信息。对于加密,我们必须遵循针对特定加密类型固定的某些步骤。
在这个问题中,我们将得到一个字符串,我们必须按照给定的步骤对其进行加密 -
首先,我们必须获取包含相同字符的所有子字符串,并将该子字符串替换为单个字符,后跟子字符串的长度。
现在,将长度更改为十六进制值,并且十六进制值的所有字符必须更改为小写。
最后,将整个字符串反转。
示例
'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)。