C++ 根据给定的编码技术从结果字符串中重建原始字符串

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。然后,我们确保字符串满足第一个和第二个条件。因此,如果我们按照相反的顺序遵循加密规则,我们可以解密字符串。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程