Decrypt the String according to given algorithm

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: geeksInput: 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 CThen, 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++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;const int MOD = 26; // Function that returns (num % 26)int modulo_by_26(string num){    // Initialize result    int res = 0;     // One by one process all digits of 'num'    for (int i = 0; i < num.length(); i++)        res = (res * 10 + (int)num[i] - '0') % MOD;     return res;} // Function to return the decrypted stringstring decrypt_message(string s){     // To store the final decrypted answer    string decrypted_str = "";     string num_found_so_far = "";     // One by one check for each character    // if it is a numeric character    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) {             // Modulo the number found in the string by 26            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;} // Driver codeint main(){    string s = "32ytAAcV4ui30hf10hj18";     // Print the decrypted string    cout << decrypt_message(s);     return 0;}
// Java implementation of the approachimport java.util.*; class GFG{     static int MOD = 26; // Function that returns (num % 26)static int modulo_by_26(String num){         // Initialize result    int res = 0;     // One by one process all digits of 'num'    for(int i = 0; i < num.length(); i++)    {       res = ((res * 10 +              (int)num.charAt(i) - '0') % MOD);    }    return res;} // Function to return the decrypted Stringstatic String decrypt_message(String s){     // To store the final decrypted answer    String decrypted_str = "";    String num_found_so_far = "";     // One by one check for each character    // if it is a numeric character    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)       {                       // Modulo the number found in the String by 26           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;} // Driver codepublic static void main(String[] args){    String s = "32ytAAcV4ui30hf10hj18";     // Print the decrypted string    System.out.print(decrypt_message(s));}} // This code is contributed by amal kumar choubey
# Python3 implementation of# the approachMOD = 26 # Function that returns# (num % 26)def modulo_by_26(num):     # Initialize result    res = 0     # One by one process all    # digits of 'num'    for i in range(len(num)):        res = ((res * 10 + ord(num[i]) -                ord('0')) % MOD)     return res # Function to return the# decrypted stringdef decrypt_message(s):     # To store the final    # decrypted answer    decrypted_str = ""     num_found_so_far = ""     # One by one check for    # each character if it    # is a numeric character    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):             # Modulo the number found            # in the string by 26            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 # Driver codeif __name__ == "__main__":     s = "32ytAAcV4ui30hf10hj18"     # Print the decrypted string    print(decrypt_message(s)) # This code is contributed by Chitranayal
// C# implementation of the approachusing System;class GFG{     static int MOD = 26; // Function that returns (num % 26)static int modulo_by_26(String num){         // Initialize result    int res = 0;     // One by one process all digits of 'num'    for(int i = 0; i < num.Length; i++)    {        res = ((res * 10 +               (int)num[i] - '0') % MOD);    }    return res;} // Function to return the decrypted Stringstatic String decrypt_message(String s){     // To store the readonly decrypted answer    String decrypted_str = "";    String num_found_so_far = "";     // One by one check for each character    // if it is a numeric character    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)        {                             // Modulo the number found            // in the String by 26            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;} // Driver codepublic static void Main(String[] args){    String s = "32ytAAcV4ui30hf10hj18";     // Print the decrypted string    Console.Write(decrypt_message(s));}} // This code is contributed by amal kumar choubey
<script> // JavaScript implementation of the approach let MOD = 26; // Function that returns (num % 26)function modulo_by_26(num){    // Initialize result    let res = 0;      // One by one process all digits of 'num'    for(let i = 0; i < num.length; i++)    {       res = ((res * 10 +              num[i].charCodeAt(0) - '0'.charCodeAt(0)) % MOD);    }    return res;} // Function to return the decrypted Stringfunction decrypt_message(s){    // To store the final decrypted answer    let decrypted_str = "";    let num_found_so_far = "";      // One by one check for each character    // if it is a numeric character    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)       {                        // Modulo the number found in the String by 26           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;} // Driver code let s = "32ytAAcV4ui30hf10hj18"; // Print the decrypted stringdocument.write(decrypt_message(s));      // This code is contributed by rag2127 </script>
geeks
 
Time Complexity: O(N)Auxiliary Space: O(N)
Amal Kumar Choubey
ukasp
rag2127
pankajsharmagfg
encoding-decoding
Modular Arithmetic
Algorithms
Mathematical
Strings
Strings
Mathematical
Modular Arithmetic
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.