C++ 根据给定的编码技术从结果字符串中重建原始字符串
在这个问题中,我们需要从给定的字符串构建出原始字符串。给定的字符串是通过给定的规则从原始字符串形成的。
在这里,我们可以使用给定的加密规则和加密字符串,通过将加密规则应用于反向顺序找到解密后的字符串。
问题描述: 给定一个长度为N的二进制字符串bin_str和正整数k。这个二进制字符串是通过以下操作和使用x值从“enc”字符串构建的。
- 如果enci-k等于1,则bin_stri等于1。
-
如果enci+k等于1,则bin_stri等于1。
-
如果上述两个条件都不满足,则bin_stri等于0。
示例:
输入:
bin_Str = "11001", k = 2
输出
00110
说明 - 让我们了解如何从输出字符串中获取bin_str字符串的每个字符。
- bin_Str[0] = ‘1’ – 在输出字符串中,索引为(0 + k)的字符是‘1’。
-
bin_Str[1] = ‘1’ – 在输出字符串中,索引为(1 + k)的字符是‘1’。
-
bin_Str[2] = ‘0’ – 在输出字符串中,索引为(2 + k)和(2 – k)的字符是0。
-
bin_Str[3] = ‘0’ – 在输出字符串中,索引为(3 + k)的字符不存在,(3 – k)的字符是0。
-
bin_Str[4] = ‘1’ – 在输出字符串中,索引为(4 – k)的字符是‘1’。
我们选择输出字符串,因为我们根据给定的加密规则从中构建bin_Str字符串。
输入
bin_Str = "00011", k = 2
输出
-1
说明 - 原始字符串不存在。
方法1
在这种方法中,我们将创建一个只包含所有‘1’的字符串。然后,根据给定的加密规则修改字符串,最后进行交叉检查以确认我们是否能获得原始字符串。
算法
步骤1 - 将’enc’字符串初始化为一个长度等于’bin_str’字符串长度的全‘1’字符串。
步骤2 - 开始遍历字符串,如果第p个索引位置的字符是’0’,则意味着如果存在(p – k)或者(p + k)字符,它应该是0。所以,如果存在,将enc[p-k]和enc[p+k]更新为’0’。
步骤3 - 如果’enc’字符串中第p个索引位置的字符是’1’,按照以下步骤进行。
步骤3.1 - 如果存在p – k,并且enc[p – k]等于1,或者存在p + k并且enc[p + k]等于1,继续下一次迭代。
步骤3.2 - 否则,返回’-1’表示字符串不存在。
步骤4 - 最后返回’enc’字符串。
示例
#include <iostream>
using namespace std;
string generateString(string bin_Str, int K) {
// Get string size
int len = bin_Str.size();
// Initialize the string with all 1's
string enc(len, '1');
// Traverse string to update
for (int p = 0; p < len; ++p) {
// For the character '0'
if (bin_Str[p] == '0') {
// If p-k or p + k exists, set it to '0' according to the reverse of the encryption condition
if (p - K >= 0) {
enc[p - K] = '0';
}
if (p + K < len) {
enc[p + K] = '0';
}
}
}
// Cross check resultant string
for (int p = 0; p < len; ++p) {
// For character '1'
if (bin_Str[p] == '1') {
// If p - k and p + k is valid and is equal to '1', continue.
if ((p - K >= 0 && enc[p - K] == '1') || (p + K < len && enc[p + K] == '1')) {
continue;
} else {
return "-1";
break;
}
}
}
return enc;
}
int main() {
// Given input
string bin_Str = "11001";
int K = 2;
string result = generateString(bin_Str, K);
if (result == "-1") {
cout << "The required string is not exist!";
} else {
cout << "The original string is: " << result << endl;
}
return 0;
}
输出
The original string is: 00110
时间复杂度 – 遍历字符串的时间复杂度为O(N)。
空间复杂度 – 辅助字符串的空间复杂度为O(N)。
在这个问题的解决方案中,我们使用加密规则从加密字符串中获取原始字符串。我们首先按第一个条件将1替换为0。然后,我们确保字符串满足第一个和第二个条件。因此,如果我们按照相反的顺序遵循加密规则,我们可以解密字符串。