Open In App

Reconstruct original string from resultant string based on given encoding technique

Improve
Improve
Like Article
Like
Save
Share
Report

A binary string S of length N is constructed from a string P of N characters and an integer X. The choice of the ith character of S is as follows:

  • If the character Pi-X exists and is equal to 1, then Si is 1
  • if the character Pi+X exists and is equal to 1, then Si is 1
  • if both of the aforementioned conditions are false, then Si is 0.

Given the resulting string S and the integer X, reconstruct the original string P. If no string P can produce the string S, output -1.

Examples:

Input: S = “10011”, X = 2
Output: “01100”
Explanation: The input string S = “10011” can be constructed from the output string P = “01100”.

Input: S = “11101100111”, X = 3
Output: -1
Explanation: The input string S = “11101100111” cannot be constructed from any output string P.

 

Approach: The task can be solved by taking an auxiliary string with all 1s. Follow the below steps to solve the problem:

  • Initialize the string P with all the characters as ‘1’.
  • Now traverse the string S using a loop and put zeroes at the correct positions in P according to the given conditions:
    • If S[i] is equal to ‘0’ and P[i-X] exists, i, e, (i-X)>=0, then put P[i-X] = ‘0’.
    • If S[i] is equal to ‘0’ and P[i+X] exists, i.e, (i+X)<N, then put P[i+X] = ‘0’.
  • Initialize a variable flag = 1 to determine whether the string P exists or not.
  • To check for the correctness of the constructed string P, traverse the string S using a for loop:
    • If S[i]==’1′ and either P[i-X] or P[i+X] exists and is equal to ‘1’, then the string P is so far correct and the traversal can continue.
    • If S[i]==’1′ and either P[i-X] or P[i+X] does not exist or is not equal to 1, then set flag = 0, output -1 and break from the loop.
  • If the flag is equal to 0 after the traversal of the string S, then output the original string P.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <iostream>
using namespace std;
 
// Function to find the original string P
void findString(string S, int X)
{
    // Stores the size of string S
    int N = S.size();
 
    // Each character of string
    // P is set to '1'
    string P(N, '1');
 
    // Loop to put zeroes at
    // the correct positions in P
    for (int i = 0; i < N; ++i) {
 
        // If the character is '0'
        if (S[i] == '0') {
 
            // If P[i-X] exists
            if (i - X >= 0) {
 
                // Set P[i-X] to '0'
                P[i - X] = '0';
            }
 
            // If P[i+X] exists
            if (i + X < N) {
 
                // Set P[i+X] to '0'
                P[i + X] = '0';
            }
        }
    }
 
    // Set flag to 1
    int flag = 1;
 
    // Loop to cross check
    // if P exists or not
    for (int i = 0; i < N; ++i) {
 
        // If the character is '1'
        if (S[i] == '1') {
 
            // If P[i-X] exists and
            // is equal to '1' or if
            // P[i+X] exists and
            // is equal to '1'
            if ((i - X >= 0
                 && P[i - X] == '1')
                || (i + X < N
                    && P[i + X] == '1')) {
                continue;
            }
            else {
 
                // Set flag to 0
                flag = 0;
 
                // Output -1
                cout << -1;
 
                // Break from the loop
                break;
            }
        }
    }
 
    // If flag is equal to 1
    if (flag == 1) {
 
        // Output string P
        cout << P;
    }
}
 
// Driver Code
int main()
{
    // Given input
    string S = "10011";
    int X = 2;
 
    // Function Call
    findString(S, X);
 
    return 0;
}


Java




// Java program for the above approach
import java.util.*;
public class GFG
{
 
  // Function to find the original string P
  static void findString(String S, int X)
  {
 
    // Stores the size of string S
    int N = S.length();
 
    // Each character of string
    // converted to char Array P
    // is set to '1'
    char[] P = new char[N];
    for (int i = 0; i < N; ++i) {
      P[i] = '1';
    }
 
    // Loop to put zeroes at
    // the correct positions in P
    for (int i = 0; i < N; ++i) {
 
      // If the character is '0'
      if (S.charAt(i) == '0') {
 
        // If P[i-X] exists
        if (i - X >= 0) {
 
          // Set P[i-X] to '0'
          P[i - X] = '0';
        }
 
        // If P[i+X] exists
        if (i + X < N) {
 
          // Set P[i+X] to '0'
          P[i + X] = '0';
        }
      }
    }
 
    // Set flag to 1
    int flag = 1;
 
    // Loop to cross check
    // if P exists or not
    for (int i = 0; i < N; ++i) {
 
      // If the character is '1'
      if (S.charAt(i) == '1') {
 
        // If P[i-X] exists and
        // is equal to '1' or if
        // P[i+X] exists and
        // is equal to '1'
        if ((i - X >= 0 && P[i - X] == '1')
            || (i + X < N && P[i + X] == '1')) {
          continue;
        }
        else {
 
          // Set flag to 0
          flag = 0;
 
          // Output -1
          System.out.print(-1);
 
          // Break from the loop
          break;
        }
      }
    }
 
    // If flag is equal to 1
    if (flag == 1) {
 
      // Output string P
      String p = new String(P);
      System.out.print(p);
    }
  }
 
  // Driver Code
  public static void main(String args[])
  {
 
    // Given input
    String S = "10011";
    int X = 2;
 
    // Function Call
    findString(S, X);
  }
}
 
// This code is contributed by Samim Hossain Mondal.


Python3




# Python program for the above approach
 
# Function to find the original string P
def findString(S, X):
 
    # Stores the size of string S
    N = len(S)
 
    # Each character of string
    # P is set to '1'
    P = ['1'] * N
 
    # Loop to put zeroes at
    # the correct positions in P
    for i in range(N):
 
        # If the character is '0'
        if (S[i] == '0'):
 
            # If P[i-X] exists
            if (i - X >= 0):
 
                # Set P[i-X] to '0'
                P[i - X] = '0';
 
            # If P[i+X] exists
            if (i + X < N):
 
                # Set P[i+X] to '0'
                P[i + X] = '0';
 
    # Set flag to 1
    flag = 1;
 
    # Loop to cross check
    # if P exists or not
    for i in range(N):
 
        # If the character is '1'
        if (S[i] == '1'):
 
            # If P[i-X] exists and
            # is equal to '1' or if
            # P[i+X] exists and
            # is equal to '1'
            if ((i - X >= 0 and P[i - X] == '1') or (i + X < N and P[i + X] == '1')):
                continue;
            else:
 
                # Set flag to 0
                flag = 0;
 
                # Output -1
                print(-1);
 
                # Break from the loop
                break;
 
    # If flag is equal to 1
    if (flag == 1):
 
        # Output string P
        print("".join(P));
 
# Driver Code
 
# Given input
S = "10011";
X = 2;
 
# Function Call
findString(S, X);
 
# This code is contributed by gfgking


C#




// C# program for the above approach
using System;
using System.Collections;
class GFG
{
 
  // Function to find the original string P
  static void findString(string S, int X)
  {
 
    // Stores the size of string S
    int N = S.Length;
 
    // Each character of string
    // converted to char Array P
    // is set to '1'
    char[] P = new char[N];
    for (int i = 0; i < N; ++i) {
      P[i] = '1';
    }
 
    // Loop to put zeroes at
    // the correct positions in P
    for (int i = 0; i < N; ++i) {
 
      // If the character is '0'
      if (S[i] == '0') {
 
        // If P[i-X] exists
        if (i - X >= 0) {
 
          // Set P[i-X] to '0'
          P[i - X] = '0';
        }
 
        // If P[i+X] exists
        if (i + X < N) {
 
          // Set P[i+X] to '0'
          P[i + X] = '0';
        }
      }
    }
 
    // Set flag to 1
    int flag = 1;
 
    // Loop to cross check
    // if P exists or not
    for (int i = 0; i < N; ++i) {
 
      // If the character is '1'
      if (S[i] == '1') {
 
        // If P[i-X] exists and
        // is equal to '1' or if
        // P[i+X] exists and
        // is equal to '1'
        if ((i - X >= 0 && P[i - X] == '1')
            || (i + X < N && P[i + X] == '1')) {
          continue;
        }
        else {
 
          // Set flag to 0
          flag = 0;
 
          // Output -1
          Console.Write(-1);
 
          // Break from the loop
          break;
        }
      }
    }
 
    // If flag is equal to 1
    if (flag == 1) {
 
      // Output string P
      string p = new string(P);
      Console.Write(p);
    }
  }
 
  // Driver Code
  public static void Main()
  {
    // Given input
    string S = "10011";
    int X = 2;
 
    // Function Call
    findString(S, X);
  }
}
 
// This code is contributed by Taranpreet


Javascript




<script>
    // JavaScript program for the above approach
 
    // Function to find the original string P
    const findString = (S, X) => {
     
        // Stores the size of string S
        let N = S.length;
 
        // Each character of string
        // P is set to '1'
        let P = new Array(N).fill('1');
 
        // Loop to put zeroes at
        // the correct positions in P
        for (let i = 0; i < N; ++i) {
 
            // If the character is '0'
            if (S[i] == '0') {
 
                // If P[i-X] exists
                if (i - X >= 0) {
 
                    // Set P[i-X] to '0'
                    P[i - X] = '0';
                }
 
                // If P[i+X] exists
                if (i + X < N) {
 
                    // Set P[i+X] to '0'
                    P[i + X] = '0';
                }
            }
        }
 
        // Set flag to 1
        let flag = 1;
 
        // Loop to cross check
        // if P exists or not
        for (let i = 0; i < N; ++i) {
 
            // If the character is '1'
            if (S[i] == '1') {
 
                // If P[i-X] exists and
                // is equal to '1' or if
                // P[i+X] exists and
                // is equal to '1'
                if ((i - X >= 0
                    && P[i - X] == '1')
                    || (i + X < N
                        && P[i + X] == '1')) {
                    continue;
                }
                else {
 
                    // Set flag to 0
                    flag = 0;
 
                    // Output -1
                    document.write(-1);
 
                    // Break from the loop
                    break;
                }
            }
        }
 
        // If flag is equal to 1
        if (flag == 1) {
 
            // Output string P
            document.write(P.join(""));
        }
    }
 
    // Driver Code
 
    // Given input
    let S = "10011";
    let X = 2;
 
    // Function Call
    findString(S, X);
 
// This code is contributed by rakeshsahni
 
</script>


 
 

Output: 

01100

 

 

Time Complexity: O(N)
Auxiliary Space: O(N)

 



Last Updated : 27 Jan, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads