根據給定的編碼技術,從結果字串重建原始字串


在這個問題中,我們需要根據給定的字串構建原始字串。給定的字串是使用給定的規則從原始字串生成的。

在這裡,我們可以使用給定的加密規則和加密字串,透過反向應用加密規則來找到解密字串。

問題陳述 – 我們給定一個長度為 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 – 使用等於“bin_str”字串長度的“1”總數初始化“enc”字串。

步驟 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。之後,我們確保字串遵循第一和第二個條件。因此,如果我們反向遵循加密規則,則可以解密字串。

更新於: 2023年8月25日

72 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告