C++ 找出使用给定加密模式表示的给定字符串中的字符串
在这个问题中,我们需要从加密字符串中找到原始字符串,使用给定的加密规则可以得到原始字符串。
问题陈述 - 我们给定了一个加密字符串。同时,我们给出了一个包含多个字符串的字符串数组。我们需要从数组中找到字符串,以便如果我们按照以下规则进行加密,我们可以得到加密后的字符串。
加密规则
- 加密字符串应以一个正整数开头,表示原始字符串中大写字母的数量。
-
在正整数之后,字符串应包含原始字符串的最后3个字符的反向顺序。
-
最后,字符串应包含一个正整数,表示字符串中所有数字的总和。
示例示例
输入
str_array = {"ABXC237klg", "esre45Qewr3"}, enc_str = "4glk12"
输出
ABXC237klg
解释 – 让我们来解密enc_str字符串。
- 4 – 字符串应包含4个大写字母。
-
glk – 原字符串的最后3个字符以相反的顺序排列。
-
12 – 所有字符串数字的和是(2 + 3 + 7 = 12)。
所以,输出字符串符合所有加密规则。
输入
str_array = {"ABXC237klp", "esre45Qewr3"}, enc_str = "4glk12"
输出结果
-1
解释 – 数组不包含对enc_str字符串进行解密的字符串。
输入
str_array = {"JK253Der", "P5Q32mnDer", "GHD23fgd4"}; enc_str = "3reD10";
输出
JK253Der
解释 - 如果我们用“JK253Der” 或者 “P5Q32mnDer”进行加密,我们会得到加密后的字符串“3reD10”。所以我们可以在输出中打印其中任意一个。
方法 1
这种方法将使用给定字符串的加密规则。首先,我们将提取起始整数并检查字符串中是否包含大写字母的总数。之后,我们将提取三个字符并检查数组字符串是否以这三个字符从最后向前的顺序结尾。最后,我们将提取加密字符串的最后一个整数,并检查它是否等于字符串中所有数字的总和。
算法
步骤 1 - 用0初始化变量 ‘p’,并用字符串长度-1初始化变量 ‘q’。
步骤 2 - 使用 while 循环,并递增 ‘p’ 的值,直到在字符串中获取到字母字符,以找到起始整数值。
步骤 3 - 同样,使用 while 循环,并递减 ‘q’ 的值,直到在字符串中获取到字母字符,以找到结束整数值。
步骤 4 - 使用 substr() 方法,使用 p 和 q 的值取正和结束的整数字符串。同样,使用 stoi() 方法将字符串转换为数字,并将其存储在 ‘initial’ 和 ‘ending’ 变量中。
步骤 5 - 使用 substr() 方法获取字符串的中间三个字符,并使用 reverse() 方法将它们反转。
步骤 6 - 开始遍历字符串数组,并初始化变量 ‘upperCase’ 和 ‘digitSum’ 为 0,以存储大写字符的总数和特定字符串的数字总和。
步骤 7 - 使用嵌套循环遍历字符串。使用 isUpper() 方法检查当前字符是否为大写字符。如果是,将 ‘upperCase’ 变量的值增加 1。
步骤 8 - 使用 isDigit() 方法检查当前字符是否为数字化字符。如果是,将数字值加到 ‘digitSum’ 变量上。
步骤 9 - 如果 ‘upperCase’ 变量的值等于 ‘initial’,‘digitSum’ 的值等于 ‘ending’,并且字符串的最后三个字符等于 ‘middle’,则返回字符串。
步骤 10 - 最后,如果我们没有找到任何字符串,则返回 “-1”。
示例
#include <bits/stdc++.h>
using namespace std;
string getOriginalStr(vector<string> str_array, string enc_str) {
// String size
int len = enc_str.size();
int p = 0, q = len - 1;
// Getting the digit's last index from the start
while (isdigit(enc_str[p]))
p++;
// Gettig the character's first index from the end
while (isdigit(enc_str[q]))
q--;
// Get initial integer
int initial = stoi(enc_str.substr(0, p));
// Get the ending integer
int ending = stoi(enc_str.substr(q + 1, len - q));
// Get middle string
string middle = enc_str.substr(p, 3);
// Reverse the string
reverse(middle.begin(), middle.end());
// Traverse array of string
for (auto temp_str : str_array) {
int upperCase = 0, digitsSum = 0;
// Traverse string
for (int p = 0; p < temp_str.length(); p++) {
// For uppercase character
if (isupper(temp_str[p]))
upperCase++;
// Get the sum of the present digits
if (isdigit(temp_str[p]))
digitsSum += (temp_str[p] - '0');
}
// Check for all conditions
if (upperCase == initial && digitsSum == ending && temp_str.substr(temp_str.length() - 3, 3) == middle)
return temp_str;
}
return "-1";
}
int main() {
vector<string> str_array = {"ABXC237klg", "esre45Qewr3"};
string enc_str = "4glk12";
cout << "The original string is - " << getOriginalStr(str_array, enc_str);
return 0;
}
输出
The original string is - ABXC237klg
时间复杂度 – O(P*Q),其中P是数组的长度,Q是字符串的最大长度。
空间复杂度 – O(1),因为我们使用恒定的空间。
每当我们需要解决类似的问题时,我们应该检查符合给定规则并生成加密字符串作为输出的字符串。