Find k’th character of decrypted string | Set 1
Given an encoded string where repetitions of substrings are represented as substring followed by count of substrings. For example, if encrypted string is “ab2cd2” and k=4 , so output will be ‘b’ because decrypted string is “ababcdcd” and 4th character is ‘b’.
Note: Frequency of encrypted substring can be of more than one digit. For example, in “ab12c3”, ab is repeated 12 times. No leading 0 is present in frequency of substring.
Examples:
Input: "a2b2c3", k = 5 Output: c Decrypted string is "aabbccc" Input : "ab4c2ed3", k = 9 Output : c Decrypted string is "ababababccededed" Input: "ab4c12ed3", k = 21 Output: e Decrypted string is "ababababccccccccccccededed"
The idea is simple. Initially take empty decrypted string then decompress the string by reading substring and it’s frequency one by one and append current substring in decrypted string by it’s frequency. Repeat the process till the end of string and print the K’th character from decrypted string.
C++
// C++ program to find K'th character in // decrypted string #include<bits/stdc++.h> using namespace std; // Function to find K'th character in Encoded String char encodedChar(string str, int k) { // expand string variable is used to // store final string after decompressing string str string expand = "" ; string temp; // Current substring int freq = 0; // Count of current substring for ( int i=0; str[i]!= '\0' ; ) { temp = "" ; // Current substring freq = 0; // count frequency of current substring // read characters untill you find a number // or end of string while (str[i]>= 'a' && str[i]<= 'z' ) { // push character in temp temp.push_back(str[i]); i++; } // read number for how many times string temp // will be repeated in decompressed string while (str[i]>= '1' && str[i]<= '9' ) { // generating frequency of temp freq = freq*10 + str[i] - '0' ; i++; } // now append string temp into expand // equal to its frequency for ( int j=1; j<=freq; j++) expand.append(temp); } // this condition is to handle the case // when string str is ended with alphabeds // not with numeric value if (freq==0) expand.append(temp); return expand[k-1]; } // Driver program to test the string int main() { string str = "ab4c12ed3" ; int k = 21; cout << encodedChar(str, k) << endl; return 0; } |
Java
// Java program to find K'th character in // decrypted string public class GFG { // Function to find K'th character in // Encoded String static char encodedChar(String str, int k) { // expand string variable is used to // store final string after decompressing // string str String expand = "" ; String temp = "" ; // Current substring int freq = 0 ; // Count of current substring for ( int i= 0 ; i < str.length() ; ) { temp = "" ; // Current substring freq = 0 ; // count frequency of current // substring // read characters until you find a number // or end of string while (i < str.length() && str.charAt(i)>= 'a' && str.charAt(i)<= 'z' ) { // push character in temp temp += str.charAt(i); i++; } // read number for how many times string temp // will be repeated in decompressed string while (i < str.length() && str.charAt(i)>= '1' && str.charAt(i)<= '9' ) { // generating frequency of temp freq = freq* 10 + str.charAt(i) - '0' ; i++; } // now append string temp into expand // equal to its frequency for ( int j= 1 ; j<=freq; j++) expand += temp; } // this condition is to handle the case // when string str is ended with alphabets // not with numeric value if (freq== 0 ) expand += temp; return expand.charAt(k- 1 ); } // Driver program to test the string public static void main(String args[]) { String str = "ab4c12ed3" ; int k = 21 ; System.out.println(encodedChar(str, k)); } } // This code is contributed by Sumit Ghosh |
Python3
# Python 3 program to find K'th character # in decrypted string # Function to find K'th character # in Encoded String def encodedChar( str , k): # expand string variable is used # to store final string after # decompressing string str expand = "" # Current substring freq = 0 # Count of current substring i = 0 while (i < len ( str )): temp = "" # Current substring freq = 0 # count frequency of current substring # read characters untill you find # a number or end of string while (i < len ( str ) and ord ( str [i]) > = ord ( 'a' ) and ord ( str [i]) < = ord ( 'z' )): # push character in temp temp + = str [i] i + = 1 # read number for how many times string temp # will be repeated in decompressed string while (i < len ( str ) and ord ( str [i]) > = ord ( '1' ) and ord ( str [i]) < = ord ( '9' )): # generating frequency of temp freq = freq * 10 + ord ( str [i]) - ord ( '0' ) i + = 1 # now append string temp into expand # equal to its frequency for j in range ( 1 , freq + 1 , 1 ): expand + = temp # this condition is to handle the case # when string str is ended with alphabeds # not with numeric value if (freq = = 0 ): expand + = temp return expand[k - 1 ] # Driver Code if __name__ = = '__main__' : str = "ab4c12ed3" k = 21 print (encodedChar( str , k)) # This code is contributed by # Shashank_Sharma |
C#
// C# program to find K'th // character in decrypted strinL using System; class GFG { // Function to find K'th // character in Encoded String static char encodedChar( string str, int k) { // expand string variable is // used to store final string // after decompressing string str String expand = "" ; String temp = "" ; // Current substring int freq = 0; // Count of current substring for ( int i = 0; i < str.Length ; ) { temp = "" ; // Current substring freq = 0; // count frequency of current // substring // read characters until you // find a number or end of string while (i < str.Length && str[i]>= 'a' && str[i]<= 'z' ) { // push character in temp temp += str[i]; i++; } // read number for how many times // string temp will be repeated // in decompressed string while (i < str.Length && str[i] >= '1' && str[i] <= '9' ) { // generating frequency of temp freq = freq * 10 + str[i] - '0' ; i++; } // now append string temp into // expand equal to its frequency for ( int j = 1; j <= freq; j++) expand += temp; } // this condition is to handle // the case when string str is // ended with alphabets not // with numeric value if (freq == 0) expand += temp; return expand[k - 1]; } // Driver Code public static void Main() { string str = "ab4c12ed3" ; int k = 21; Console.Write(encodedChar(str, k)); } } // This code is contributed // by ChitraNayal |
Output:
e
Exercise : The above solution builds the decoded string to find k’th character. Extend the solution to work in O(1) extra space.
Find k-th character of decrypted string | Set – 2
This article is contributed by Shashank Mishra ( Gullu ) and reviewed by team GeeksforGeeks. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Recommended Posts:
- Find k-th character of decrypted string | Set - 2
- Find a string such that every character is lexicographically greater than its immediate next character
- Find the character in first string that is present at minimum index in second string
- Queries to find the first non-repeating character in the sub-string of a string
- Queries to find the last non-repeating character in the sub-string of a given string
- Find the first repeated character in a string
- Find last index of a character in a string
- Find the last non repeating character in string
- Find one extra character in a string
- Given a string, find its first non-repeating character
- Program to find the kth character after decrypting a string
- Find repeated character present first in a string
- Find the character made by adding all the characters of the given string
- Find i'th Index character in a binary string obtained after n iterations
- Efficiently find first repeated character in a string without using any additional data structure in one traversal