Convert a Mobile Numeric Keypad sequence to equivalent sentence - GeeksforGeeks

28 Jan, 2022
Given a string S of size N, consisting of digits [0 – 9] and character ‘.’, the task is to print the string that can be obtained by pressing the mobile keypad in the given sequence. 
Note: ‘.’ represents a break while typing.
Below is the image to represent the characters associated with each number in the keypad.
Examples: 
Input: S = “234”Output: ADGExplanation:Pressing the keys 2, 3, and 4 once gives the resultant string as “ADG”.
Input: S = “22.22”Output: BBExplanation:Pressing the key 2 twice gives B, and then again pressing the key twice gives B. Therefore, the resultant string is “BB”.
Approach: The given problem can be solved by storing the mobile keypad mappings in an array and then traverse the string S and convert it into its equivalent string. Follow the steps below to solve the problem:
Initialize an empty string, say ans to store the required result.
Store the string associated to each key in the mobile keypad in an array nums[] such that nums[i] represent the set of characters on pressing the digit i.
Traverse the given string S using the variable i and perform the following steps:If S[i] is equal to ‘.’, then increment i by 1, and continue to the next iteration.Otherwise, initialize a variable cnt as 0 to store the count of the same characters.Iterate until S[i] is equal to S[i + 1] and in each iteration check the following conditions:If cnt is equal to 2 and S[i] is 2, 3, 4, 5, 6, or 8, then break out of the loop because keys: 2, 3, 4, 5, 6, and 8 contain the same number of characters, i.e., 3.If cnt is equal to 3 and S[i] is 7 or 9, then break out of the loop because keys: 7 and 9 contain the same number of characters, i.e., 4.Increment the value of cnt and i by 1.If S[i] is either 7 or 9, then add the character nums[str[i]][cnt%4] to the string ans.Otherwise, add the character nums[str[i]][cnt%3] to the string ans.Increment the value of i by 1.
If S[i] is equal to ‘.’, then increment i by 1, and continue to the next iteration.
Otherwise, initialize a variable cnt as 0 to store the count of the same characters.
Iterate until S[i] is equal to S[i + 1] and in each iteration check the following conditions:If cnt is equal to 2 and S[i] is 2, 3, 4, 5, 6, or 8, then break out of the loop because keys: 2, 3, 4, 5, 6, and 8 contain the same number of characters, i.e., 3.If cnt is equal to 3 and S[i] is 7 or 9, then break out of the loop because keys: 7 and 9 contain the same number of characters, i.e., 4.Increment the value of cnt and i by 1.
If cnt is equal to 2 and S[i] is 2, 3, 4, 5, 6, or 8, then break out of the loop because keys: 2, 3, 4, 5, 6, and 8 contain the same number of characters, i.e., 3.
If cnt is equal to 3 and S[i] is 7 or 9, then break out of the loop because keys: 7 and 9 contain the same number of characters, i.e., 4.
Increment the value of cnt and i by 1.
If S[i] is either 7 or 9, then add the character nums[str[i]][cnt%4] to the string ans.
Otherwise, add the character nums[str[i]][cnt%3] to the string ans.
Increment the value of i by 1.
After completing the above steps, print the value string ans as the result.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to convert mobile numeric// keypad sequence into its equivalent// stringvoid printSentence(string str){    // Store the mobile keypad mappings    char nums[][5]        = { "", "", "ABC", "DEF", "GHI",            "JKL", "MNO", "PQRS", "TUV",            "WXYZ" };     // Traverse the string str    int i = 0;    while (str[i] != '\0') {         // If the current character is        // '.', then continue to the        // next iteration        if (str[i] == '.') {            i++;            continue;        }         // Stores the number of        // continuous clicks        int count = 0;         // Iterate a loop to find the        // count of same characters        while (str[i + 1]               && str[i] == str[i + 1]) {             // 2, 3, 4, 5, 6 and 8 keys will            // have maximum of 3 letters            if (count == 2                && ((str[i] >= '2'                     && str[i] <= '6')                    || (str[i] == '8')))                break;             // 7 and 9 keys will have            // maximum of 4 keys            else if (count == 3                     && (str[i] == '7'                         || str[i] == '9'))                break;            count++;            i++;             // Handle the end condition            if (str[i] == '\0')                break;        }         // Check if the current pressed        // key is 7 or 9        if (str[i] == '7' || str[i] == '9') {            cout << nums[str[i] - 48][count % 4];        }         // Else, the key pressed is        // either 2, 3, 4, 5, 6 or 8        else {            cout << nums[str[i] - 48][count % 3];        }        i++;    }} // Driver Codeint main(){    string str = "234";    printSentence(str);    return 0;}
// java program for the above approachimport java.io.*;import java.lang.*;import java.util.*; public class GFG {     // Function to convert mobile numeric    // keypad sequence into its equivalent    // string    static void printSentence(String S)    {        // Store the mobile keypad mappings        String nums[]            = { "",    "",    "ABC",  "DEF", "GHI",                "JKL", "MNO", "PQRS", "TUV", "WXYZ" };         char str[] = S.toCharArray();         // Traverse the string str        int i = 0;        while (i < str.length) {             // If the current character is            // '.', then continue to the            // next iteration            if (str[i] == '.') {                i++;                continue;            }             // Stores the number of            // continuous clicks            int count = 0;             // Iterate a loop to find the            // count of same characters            while (i + 1 < str.length                   && str[i] == str[i + 1]) {                 // 2, 3, 4, 5, 6 and 8 keys will                // have maximum of 3 letters                if (count == 2                    && ((str[i] >= '2' && str[i] <= '6')                        || (str[i] == '8')))                    break;                 // 7 and 9 keys will have                // maximum of 4 keys                else if (count == 3                         && (str[i] == '7'                             || str[i] == '9'))                    break;                count++;                i++;                 // Handle the end condition                if (i == str.length)                    break;            }             // Check if the current pressed            // key is 7 or 9            if (str[i] == '7' || str[i] == '9') {                System.out.print(                    nums[str[i] - 48].charAt(count % 4));            }             // Else, the key pressed is            // either 2, 3, 4, 5, 6 or 8            else {                System.out.print(                    nums[str[i] - 48].charAt(count % 3));            }            i++;        }    }     // Driver Code    public static void main(String[] args)    {         String str = "234";        printSentence(str);    }} // This code is contributed by Kingash.
# Python3 program for the above approach # Function to convert mobile numeric# keypad sequence into its equivalent# stringdef printSentence(str1):         # Store the mobile keypad mappings    nums = [ "", "", "ABC", "DEF", "GHI", "JKL",             "MNO", "PQRS", "TUV", "WXYZ" ]     # Traverse the string str1    i = 0         while (i < len(str1)):                 # If the current character is        # '.', then continue to the        # next iteration        if (str1[i] == '.'):            i += 1            continue         # Stores the number of        # continuous clicks        count = 0         # Iterate a loop to find the        # count of same characters        while (i + 1 < len(str1) and str1[i + 1] and                          str1[i] == str1[i + 1]):             # 2, 3, 4, 5, 6 and 8 keys will            # have maximum of 3 letters            if (count == 2 and ((str1[i] >= '2' and             str1[i] <= '6') or (str1[i] == '8'))):                break             # 7 and 9 keys will have            # maximum of 4 keys            elif (count == 3 and (str1[i] == '7' or                                  str1[i] == '9')):                break                         count += 1            i += 1             # Handle the end condition            if (i < len(str)):                break         # Check if the current pressed        # key is 7 or 9        if (str1[i] == '7' or str1[i] == '9'):            print(nums[ord(str1[i]) - 48][count % 4], end = "")         # Else, the key pressed is        # either 2, 3, 4, 5, 6 or 8        else:            print(nums[ord(str1[i]) - 48][count % 3], end = "")                     i += 1 # Driver Codeif __name__ == '__main__':         str1 = "234"    printSentence(str1) # This code is contributed by bgangwar59
// C# program for the above approachusing System;public class GFG{     // Function to convert mobile numeric    // keypad sequence into its equivalent    // string    static void printSentence(string S)    {               // Store the mobile keypad mappings        string[] nums            = { "",    "",    "ABC",  "DEF", "GHI",                "JKL", "MNO", "PQRS", "TUV", "WXYZ" };         char[] str = S.ToCharArray();         // Traverse the string str        int i = 0;        while (i < str.Length) {             // If the current character is            // '.', then continue to the            // next iteration            if (str[i] == '.') {                i++;                continue;            }             // Stores the number of            // continuous clicks            int count = 0;             // Iterate a loop to find the            // count of same characters            while (i + 1 < str.Length                   && str[i] == str[i + 1]) {                 // 2, 3, 4, 5, 6 and 8 keys will                // have maximum of 3 letters                if (count == 2                    && ((str[i] >= '2' && str[i] <= '6')                        || (str[i] == '8')))                    break;                 // 7 and 9 keys will have                // maximum of 4 keys                else if (count == 3                         && (str[i] == '7'                             || str[i] == '9'))                    break;                count++;                i++;                 // Handle the end condition                if (i == str.Length)                    break;            }             // Check if the current pressed            // key is 7 or 9            if (str[i] == '7' || str[i] == '9') {                Console.Write(nums[str[i] - 48][count % 4]);            }             // Else, the key pressed is            // either 2, 3, 4, 5, 6 or 8            else {                Console.Write(nums[str[i] - 48][count % 3]);            }            i++;        }    }     // Driver Code    public static void Main(string[] args)    {         string str = "234";        printSentence(str);    }} // This code is contributed by ukasp.
<script> // Javascript program for the above approach // Function to convert mobile numeric// keypad sequence into its equivalent// stringfunction printSentence(S){         // Store the mobile keypad mappings    let nums = [ "", "", "ABC", "DEF", "GHI",                 "JKL", "MNO", "PQRS", "TUV", "WXYZ"];     let str = S.split("");     // Traverse the string str    let i = 0;    while (i < str.length)    {                 // If the current character is        // '.', then continue to the        // next iteration        if (str[i] == '.')        {            i++;            continue;        }         // Stores the number of        // continuous clicks        let count = 0;         // Iterate a loop to find the        // count of same characters        while (i + 1 < str.length &&               str[i] == str[i + 1])        {                         // 2, 3, 4, 5, 6 and 8 keys will            // have maximum of 3 letters            if (count == 2 && ((str[i] >= '2' &&                str[i] <= '6') || (str[i] == '8')))                break;             // 7 and 9 keys will have            // maximum of 4 keys            else if (count == 3 && (str[i] == '7' ||                                    str[i] == '9'))                break;                             count++;            i++;             // Handle the end condition            if (i == str.length)                break;        }         // Check if the current pressed        // key is 7 or 9        if (str[i] == '7' || str[i] == '9')        {            document.write(                nums[str[i].charCodeAt(0) - 48][count % 4]);        }         // Else, the key pressed is        // either 2, 3, 4, 5, 6 or 8        else        {            document.write(                nums[str[i].charCodeAt(0) - 48][count % 3]);        }        i++;    }} // Driver Codelet str = "234"; printSentence(str); // This code is contributed by _saurabh_jaiswal. </script>
ADG
 
Time Complexity: O(N)Auxiliary Space: O(1)
Kingash
ukasp
bgangwar59
_saurabh_jaiswal
surinderdawra388
Amazon
interview-preparation
Backtracking
Hash
Mathematical
Strings
Amazon
Hash
Strings
Mathematical
Backtracking
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
The Knight's tour problem | Backtracking-1
Backtracking | Introduction
m Coloring Problem | Backtracking-5
Print all paths from a given source to a destination
Hamiltonian Cycle | Backtracking-6
Internal Working of HashMap in Java
Hashing | Set 1 (Introduction)
Hashing | Set 3 (Open Addressing)
Count pairs with given sum
Hashing | Set 2 (Separate Chaining)