Decode the string encoded with the given algorithm

Given a decoded string str which was decoded with the following encoding algorithm:
Write down the middle character of the string then delete it and repeat the process until there are no characters left. For example, “abba” will be encoded as “bbaa”.
Note that the middle character is the first character of the two middle characters when the length of the string is even.

Examples:

Input: "ofrsgkeeeekgs"
Output: geeksforgeeks

Input: str = "bbaa"
Output: abba

Approach: It can be observed that while decoding the string, the first letter of the encoded string becomes the median of the decoded string. So first, write the very first character of the encoded string and remove it from the encoded string then start adding the first character of the encoded string first to the left and then to the right of the decoded string and do this task repeatedly till the encoded string becomes empty.

For example:

Encoded String          Decoded String
ofrsgkeeeekgs           o
frsgkeeeekgs            fo
rsgkeeeekgs             for
sgkeeeekgs              sfor
gkeeeekgs               sforg
keeeekgs                ksforg
eeeekgs                 ksforge
eeekgs                  eksforge
eekgs                   eksforgee
ekgs                    eeksforgee
kgs                     eeksforgeek
gs                      geeksgorgeek
s                       geeksforgeeks                     

Below is the implementation of the above approach:

C++



filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to decode and print
// the original string
void decodeStr(string str, int len)
{
  
    // To store the decoded string
    char c[len] = "";
    int med, pos = 1, k;
  
    // Getting the mid element
    if (len % 2 == 1)
        med = len / 2;
    else
        med = len / 2 - 1;
  
    // Storing the first element of the
    // string at the median position
    c[med] = str[0];
  
    // If the length is even then store
    // the second element also
    if (len % 2 == 0)
        c[med + 1] = str[1];
  
    // k represents the number of characters
    // that are already stored in the c[]
    if (len & 1)
        k = 1;
    else
        k = 2;
  
    for (int i = k; i < len; i += 2) {
        c[med - pos] = str[i];
  
        // If string length is odd
        if (len % 2 == 1)
            c[med + pos] = str[i + 1];
  
        // If it is even
        else
            c[med + pos + 1] = str[i + 1];
        pos++;
    }
  
    // Print the decoded string
    for (int i = 0; i < len; i++)
        cout << c[i];
}
  
// Driver code
int main()
{
    string str = "ofrsgkeeeekgs";
    int len = str.length();
  
    decodeStr(str, len);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG{
  
// Function to decode and print
// the original String
static void decodeStr(String str, int len)
{
  
    // To store the decoded String
    char []c = new char[len];
    int med, pos = 1, k;
  
    // Getting the mid element
    if (len % 2 == 1)
        med = len / 2;
    else
        med = len / 2 - 1;
  
    // Storing the first element of the
    // String at the median position
    c[med] = str.charAt(0);
  
    // If the length is even then store
    // the second element also
    if (len % 2 == 0)
        c[med + 1] = str.charAt(1);
  
    // k represents the number of characters
    // that are already stored in the c[]
    if (len % 2 == 1)
        k = 1;
    else
        k = 2;
  
    for(int i = k; i < len; i += 2)
    {
       c[med - pos] = str.charAt(i);
         
       // If String length is odd
       if (len % 2 == 1)
           c[med + pos] = str.charAt(i + 1);
             
       // If it is even
       else
           c[med + pos + 1] = str.charAt(i + 1);
       pos++;
    }
  
    // Print the decoded String
    for (int i = 0; i < len; i++)
        System.out.print(c[i]);
}
  
// Driver code
public static void main(String[] args)
{
    String str = "ofrsgkeeeekgs";
    int len = str.length();
  
    decodeStr(str, len);
}
}
  
// This code is contributed by 29AjayKumar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
  
class GFG{
  
// Function to decode and print
// the original String
static void decodeStr(String str, int len)
{
  
    // To store the decoded String
    char []c = new char[len];
      
    int med, pos = 1, k;
  
    // Getting the mid element
    if (len % 2 == 1)
        med = len / 2;
    else
        med = len / 2 - 1;
  
    // Storing the first element of the
    // String at the median position
    c[med] = str[0];
  
    // If the length is even then store
    // the second element also
    if (len % 2 == 0)
        c[med + 1] = str[1];
  
    // k represents the number of characters
    // that are already stored in the c[]
    if (len % 2 == 1)
        k = 1;
    else
        k = 2;
  
    for(int i = k; i < len; i += 2)
    {
       c[med - pos] = str[i];
         
       // If String length is odd
       if (len % 2 == 1)
           c[med + pos] = str[i + 1];
         
       // If it is even
       else
           c[med + pos + 1] = str[i + 1];
       pos++;
    }
  
    // Print the decoded String
    for(int i = 0; i < len; i++)
       Console.Write(c[i]);
}
  
// Driver code
public static void Main(String[] args)
{
    String str = "ofrsgkeeeekgs";
    int len = str.Length;
  
    decodeStr(str, len);
}
}
  
// This code is contributed by sapnasingh4991

chevron_right


Output:

geeksforgeeks

The Complexity: O(n)

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.