Table of Contents
Problem Statement
In this problem, we are given a string containing digits (0-9) and ‘#’. We have to convert this string to a string of lowercase english letters by using the following mapping.
Example
s = "10#11#12"
"jkab"
Explanation:
“10#” -> “j” , “11#” -> “k” , “1” -> “a” , “2” -> “b”.
s = "1326#"
"acz"
Explanation:
“1” -> “a” , “3” -> “c” , “26#” -> “z”.
Approach
We can see that we just have to concern about ‘#’. When we traverse the given string from left to right using counter (let i), then, for each index i (0<=i<=n-3), we just have to check if the character at next to next index from i i.e. character at index i+2 is ‘#’.
For each i (0 to n-3), if character at index i+2 is ‘#’ then combine this index i with i+1 and form a character using these two digits.
e.g. “12#” , if we traverse the string from left to right, We see that when i=0 then character at index i+2 is ‘#’. Thus combine digits present at indexes i and i+1 i.e. combine digits 1 and 2, make them “12”. Now convert 12 to its character mapping i.e. “l” and append it into stringbuilder sb.
To convert string “12” to character ‘l’, we have created a convert function, which takes a number in string format and convert it to corresponding character.
And if the character at index i+2 is not ‘#’ then we should not combine character at index i with character at index i+1.
e.g. “123” , if we see from index i=0, index i+2 i.e. character at 2 is not ‘#’, thus we will just append character conversion of “1” in our answer.
For character at index n-2 and n-1, we can say that if char at n-1 would be already ‘#’, then we would be out of the loop after index n-3, else both characters at n-2 and n-1 must be mapped separately.
Implementation
C++ Program for Decrypt String from Alphabet to Integer Mapping Leetcode Solution
#include <bits/stdc++.h> using namespace std; char convert(string str){ stringstream ss(str); int num; ss>>num; return num+96; } string freqAlphabets(string s) { stringstream ss; int i=0; while(i<s.length()-2){ char ch; if(s[i+2]=='#'){ ch=(char)convert(s.substr(i, 2) ); i+=2; }else{ ch=(char)convert(s.substr(i,1)); } i++; ss<<ch; } while(i<s.length()){ char ch=(char)convert(s.substr(i,1)); ss<<ch; i++; } return ss.str(); } int main() { cout << freqAlphabets("1326#") ; }
acz
Java Program for Decrypt String from Alphabet to Integer Mapping Leetcode Solution
import java.util.*; import java.lang.*; class Rextester { public static String freqAlphabets(String s) { StringBuilder sb=new StringBuilder(); int i=0; while(i<s.length()-2){ char ch; if(s.charAt(i+2)=='#'){ ch=(char)convert(s.substring(i,i+2)); i+=2; }else{ ch=(char)convert(s.substring(i,i+1)); } i++; sb.append(ch); } while(i<s.length()){ char ch=(char)convert(s.substring(i,i+1)); sb.append(ch); i++; } return sb.toString(); } public static int convert(String str){ int num=Integer.parseInt(str); return num+96; } public static void main(String args[]) { System.out.println(freqAlphabets("10#11#12")); } }
jkab
Complexity Analysis for Decrypt String from Alphabet to Integer Mapping Leetcode Solution
Time Complexity
O(n): Because we are traversing our input string linearly from left to right thus O(n) time will be taken.
Space Complexity
O(n): We have used a string builder in case of java and string stream in cpp. In worst case then length would be same as input string length. Thus, space complexity too is O(n).