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++
#include <bits/stdc++.h>
using namespace std;
void decodeStr(string str, int len)
{
char c[len] = "" ;
int med, pos = 1, k;
if (len % 2 == 1)
med = len / 2;
else
med = len / 2 - 1;
c[med] = str[0];
if (len % 2 == 0)
c[med + 1] = str[1];
if (len & 1)
k = 1;
else
k = 2;
for ( int i = k; i < len; i += 2) {
c[med - pos] = str[i];
if (len % 2 == 1)
c[med + pos] = str[i + 1];
else
c[med + pos + 1] = str[i + 1];
pos++;
}
for ( int i = 0; i < len; i++)
cout << c[i];
}
int main()
{
string str = "ofrsgkeeeekgs" ;
int len = str.length();
decodeStr(str, len);
return 0;
}
|
Java
class GFG{
static void decodeStr(String str, int len)
{
char []c = new char [len];
int med, pos = 1 , k;
if (len % 2 == 1 )
med = len / 2 ;
else
med = len / 2 - 1 ;
c[med] = str.charAt( 0 );
if (len % 2 == 0 )
c[med + 1 ] = str.charAt( 1 );
if (len % 2 == 1 )
k = 1 ;
else
k = 2 ;
for ( int i = k; i < len; i += 2 )
{
c[med - pos] = str.charAt(i);
if (len % 2 == 1 )
c[med + pos] = str.charAt(i + 1 );
else
c[med + pos + 1 ] = str.charAt(i + 1 );
pos++;
}
for ( int i = 0 ; i < len; i++)
System.out.print(c[i]);
}
public static void main(String[] args)
{
String str = "ofrsgkeeeekgs" ;
int len = str.length();
decodeStr(str, len);
}
}
|
Python3
def decodeStr( str , len ):
c = ["" for i in range ( len )]
pos = 1
if ( len % 2 = = 1 ):
med = int ( len / 2 )
else :
med = int ( len / 2 - 1 )
c[med] = str [ 0 ]
if ( len % 2 = = 0 ):
c[med + 1 ] = str [ 1 ]
if ( len & 1 ):
k = 1
else :
k = 2
for i in range (k, len , 2 ):
c[med - pos] = str [i]
if ( len % 2 = = 1 ):
c[med + pos] = str [i + 1 ]
else :
c[med + pos + 1 ] = str [i + 1 ]
pos + = 1
print ( * c, sep = "")
str = "ofrsgkeeeekgs"
len = len ( str )
decodeStr( str , len )
|
C#
using System;
class GFG{
static void decodeStr(String str, int len)
{
char []c = new char [len];
int med, pos = 1, k;
if (len % 2 == 1)
med = len / 2;
else
med = len / 2 - 1;
c[med] = str[0];
if (len % 2 == 0)
c[med + 1] = str[1];
if (len % 2 == 1)
k = 1;
else
k = 2;
for ( int i = k; i < len; i += 2)
{
c[med - pos] = str[i];
if (len % 2 == 1)
c[med + pos] = str[i + 1];
else
c[med + pos + 1] = str[i + 1];
pos++;
}
for ( int i = 0; i < len; i++)
Console.Write(c[i]);
}
public static void Main(String[] args)
{
String str = "ofrsgkeeeekgs" ;
int len = str.Length;
decodeStr(str, len);
}
}
|
Javascript
<script>
function decodeStr(str, len)
{
var c = Array(len).fill( "" );
var med, pos = 1, k;
if (len % 2 == 1)
med = parseInt(len / 2);
else
med = parseInt(len / 2) - 1;
c[med] = str[0];
if (len % 2 == 0)
c[med + 1] = str[1];
if (len & 1)
k = 1;
else
k = 2;
for ( var i = k; i < len; i += 2) {
c[med - pos] = str[i];
if (len % 2 == 1)
c[med + pos] = str[i + 1];
else
c[med + pos + 1] = str[i + 1];
pos++;
}
for ( var i = 0; i < len; i++)
{
document.write(c[i]);
}
}
var str = "ofrsgkeeeekgs" ;
var len = str.length;
decodeStr(str, len);
</script>
|
The Complexity: O(n)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
31 May, 2021
Like Article
Save Article