Decrypt the String according to given algorithm
Last Updated :
18 Aug, 2021
Given encrypted string str consisting of alphabets and numeric characters, the task is to decrypt the string and find the encrypted message.
In order to decrypt the message, find every cluster of numeric characters representing a single alphabetic character which can be obtained by calculating the modulus of the number with 26 and the found value from the range [0, 25] can be mapped with the characters [‘a’, ‘z’].
For example, if str = “32ytAAcV4ui30hf10hj18” then the clusters of numeric characters will be {32, 4, 30, 10, 18} which gives {6, 4, 4, 10, 18} after performing modulus with 26 and can be mapped to {‘g’, ‘e’, ‘e’, ‘k’, ‘s’}
Examples:
Input: str = “this50hi4huji70”
Output: geeks
Input: str = “a1s2d3f3”
Output: bcdd
Approach: The idea is to traverse each character one by one in a string, then check if it is a numeric character or not. If it is then concatenate it into a string. Finally, modulo that number string with 26.
While doing modulo operation, we can’t simply do x % 26 as the number can be too large and will result in an integer overflow.
To handle this, we will process all digits one by one and use the property that
(A * B) mod C = ((A mod C) * (B mod C)) mod C
Then, finally decode back each integer to character by 0, 1, 2, 3, …25 to ‘a’, ‘b’, ‘c’, …’z’, concatenate all characters and print the final result.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int MOD = 26;
int modulo_by_26(string num)
{
int res = 0;
for ( int i = 0; i < num.length(); i++)
res = (res * 10 + ( int )num[i] - '0' ) % MOD;
return res;
}
string decrypt_message(string s)
{
string decrypted_str = "" ;
string num_found_so_far = "" ;
for ( int i = 0; i < s.length(); ++i) {
if (s[i] >= '0' && s[i] <= '9' ) {
num_found_so_far += s[i];
}
else if (num_found_so_far.length() > 0) {
decrypted_str += 'a'
+ modulo_by_26(num_found_so_far);
num_found_so_far = "" ;
}
}
if (num_found_so_far.length() > 0) {
decrypted_str += 'a'
+ modulo_by_26(num_found_so_far);
}
return decrypted_str;
}
int main()
{
string s = "32ytAAcV4ui30hf10hj18" ;
cout << decrypt_message(s);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int MOD = 26 ;
static int modulo_by_26(String num)
{
int res = 0 ;
for ( int i = 0 ; i < num.length(); i++)
{
res = ((res * 10 +
( int )num.charAt(i) - '0' ) % MOD);
}
return res;
}
static String decrypt_message(String s)
{
String decrypted_str = "" ;
String num_found_so_far = "" ;
for ( int i = 0 ; i < s.length(); ++i)
{
if (s.charAt(i) >= '0' && s.charAt(i) <= '9' )
{
num_found_so_far += s.charAt(i);
}
else if (num_found_so_far.length() > 0 )
{
decrypted_str += ( char )( 'a' +
modulo_by_26(num_found_so_far));
num_found_so_far = "" ;
}
}
if (num_found_so_far.length() > 0 )
{
decrypted_str += ( char )( 'a' +
modulo_by_26(num_found_so_far));
}
return decrypted_str;
}
public static void main(String[] args)
{
String s = "32ytAAcV4ui30hf10hj18" ;
System.out.print(decrypt_message(s));
}
}
|
Python3
MOD = 26
def modulo_by_26(num):
res = 0
for i in range ( len (num)):
res = ((res * 10 + ord (num[i]) -
ord ( '0' )) % MOD)
return res
def decrypt_message(s):
decrypted_str = ""
num_found_so_far = ""
for i in range ( len (s)):
if (s[i] > = '0' and
s[i] < = '9' ):
num_found_so_far + = s[i]
elif ( len (num_found_so_far) > 0 ):
decrypted_str + = chr ( ord ( 'a' ) +
(modulo_by_26(num_found_so_far)))
num_found_so_far = ""
if ( len (num_found_so_far) > 0 ):
decrypted_str + = chr ( ord ( 'a' ) +
(modulo_by_26(num_found_so_far)))
return decrypted_str
if __name__ = = "__main__" :
s = "32ytAAcV4ui30hf10hj18"
print (decrypt_message(s))
|
C#
using System;
class GFG{
static int MOD = 26;
static int modulo_by_26(String num)
{
int res = 0;
for ( int i = 0; i < num.Length; i++)
{
res = ((res * 10 +
( int )num[i] - '0' ) % MOD);
}
return res;
}
static String decrypt_message(String s)
{
String decrypted_str = "" ;
String num_found_so_far = "" ;
for ( int i = 0; i < s.Length; ++i)
{
if (s[i] >= '0' && s[i] <= '9' )
{
num_found_so_far += s[i];
}
else if (num_found_so_far.Length > 0)
{
decrypted_str += ( char )( 'a' +
modulo_by_26(num_found_so_far));
num_found_so_far = "" ;
}
}
if (num_found_so_far.Length > 0)
{
decrypted_str += ( char )( 'a' +
modulo_by_26(num_found_so_far));
}
return decrypted_str;
}
public static void Main(String[] args)
{
String s = "32ytAAcV4ui30hf10hj18" ;
Console.Write(decrypt_message(s));
}
}
|
Javascript
<script>
let MOD = 26;
function modulo_by_26(num)
{
let res = 0;
for (let i = 0; i < num.length; i++)
{
res = ((res * 10 +
num[i].charCodeAt(0) - '0' .charCodeAt(0)) % MOD);
}
return res;
}
function decrypt_message(s)
{
let decrypted_str = "" ;
let num_found_so_far = "" ;
for (let i = 0; i < s.length; ++i)
{
if (s[i].charCodeAt(0) >= '0' .charCodeAt(0) &&
s[i].charCodeAt(0) <= '9' .charCodeAt(0))
{
num_found_so_far += s[i];
}
else if (num_found_so_far.length > 0)
{
decrypted_str += String.fromCharCode( 'a' .charCodeAt(0) +
modulo_by_26(num_found_so_far));
num_found_so_far = "" ;
}
}
if (num_found_so_far.length > 0)
{
decrypted_str += String.fromCharCode( 'a' .charCodeAt(0) +
modulo_by_26(num_found_so_far));
}
return decrypted_str;
}
let s = "32ytAAcV4ui30hf10hj18" ;
document.write(decrypt_message(s));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...