Find k-th character of decrypted string | Set - 2 - GeeksforGeeks

21 Apr, 2021
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"
The solution discussed in previous post requires additional O(n) space. The following post discuss a solution that requires constant space. The stepwise algorithm is: 
Find length of current substring. Use two pointers. Fix one pointer at beginning of substring and move another pointer until a digit is not found.Find frequency of repetition by moving the second pointer further until an alphabet is not found.Find length of substring if it is repeated by multiplying frequency and its original length.If this length is less than k, then required character lies in substring that follows. Subtract this length from k to keep count of number of characters that are required to be covered.If length is less than or equal to k, then required character lies in current substring. As k is 1-indexed reduce it by 1 and then take its mod with original substring length. Required character is kth character from starting of substring which is pointed by first pointer.
Find length of current substring. Use two pointers. Fix one pointer at beginning of substring and move another pointer until a digit is not found.
Find frequency of repetition by moving the second pointer further until an alphabet is not found.
Find length of substring if it is repeated by multiplying frequency and its original length.
If this length is less than k, then required character lies in substring that follows. Subtract this length from k to keep count of number of characters that are required to be covered.
If length is less than or equal to k, then required character lies in current substring. As k is 1-indexed reduce it by 1 and then take its mod with original substring length. Required character is kth character from starting of substring which is pointed by first pointer.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// 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 Stringchar encodedChar(string str, int k){    int i, j;     int n = str.length();     // To store length of substring    int len;     // To store length of substring when    // it is repeated    int num;     // To store frequency of substring    int freq;     i = 0;     while (i < n) {        j = i;        len = 0;        freq = 0;         // Find length of substring by        // traversing the string until        // no digit is found.        while (j < n && isalpha(str[j])) {            j++;            len++;        }         // Find frequency of preceding substring.        while (j < n && isdigit(str[j])) {            freq = freq * 10 + (str[j] - '0');            j++;        }         // Find length of substring when        // it is repeated.        num = freq * len;         // If length of repeated substring is less than        // k then required character is present in next        // substring. Subtract length of repeated        // substring from k to keep account of number of        // characters required to be visited.        if (k > num) {            k -= num;            i = j;        }         // If length of repeated substring is        // more or equal to k then required        // character lies in current substring.        else {            k--;            k %= len;            return str[i + k];        }    }     // This is for the case when there    // are no repetition in string.    // e.g. str="abced".    return str[k - 1];} // Driver Codeint main(){    string str = "abced";    int k = 4;     cout << encodedChar(str, k) << endl;     return 0;}
// Java program to find K'th character in// decrypted stringimport java.util.*; class GFG{ // Function to find K'th character in// Encoded Stringstatic char encodedChar(char[] str, int k){    int i, j;     int n = str.length;     // To store length of substring    int len;     // To store length of substring when    // it is repeated    int num;     // To store frequency of substring    int freq;     i = 0;     while (i < n)    {        j = i;        len = 0;        freq = 0;         // Find length of substring by        // traversing the string until        // no digit is found.        while (j < n && Character.isAlphabetic(str[j]))        {            j++;            len++;        }         // Find frequency of preceding substring.        while (j < n && Character.isDigit(str[j]))        {            freq = freq * 10 + (str[j] - '0');            j++;        }         // Find length of substring when        // it is repeated.        num = freq * len;         // If length of repeated substring is less than        // k then required character is present in next        // substring. Subtract length of repeated        // substring from k to keep account of number of        // characters required to be visited.        if (k > num)        {            k -= num;            i = j;        }         // If length of repeated substring is        // more or equal to k then required        // character lies in current substring.        else        {            k--;            k %= len;            return str[i + k];        }    }     // This is for the case when there    // are no repetition in string.    // e.g. str="abced".    return str[k - 1];} // Driver Codepublic static void main(String[] args){    String str = "abced";    int k = 4;     System.out.println(encodedChar(str.toCharArray(), k));}} // This code is contributed by 29AjayKumar
# Python3 program to find K'th# character in decrypted string # Function to find K'th character# in Encoded Stringdef encodedChar(string, k):     n = len(string)     i = 0    while i < n:        j = i        length = 0        freq = 0         # Find length of substring by        # traversing the string until        # no digit is found.        while j < n and string[j].isalpha():            j += 1            length += 1         # Find frequency of preceding substring.        while j < n and string[j].isdigit():            freq = freq * 10 + int(string[j])            j += 1         # Find the length of the substring        # when it is repeated.        num = freq * length         # If the length of the repeated substring        # is less than k then required character        # is present in next substring. Subtract        # the length of repeated substring from        # k to keep account of the number        # of characters required to be visited.        if k > num:            k -= num            i = j         # If length of repeated substring is        # more or equal to k then required        # character lies in current substring.        else:            k -= 1            k %= length            return string[i + k]     # This is for the case when there are no    # repetition in string. e.g. str="abced".    return string[k - 1] # Driver Codeif __name__ == "__main__":     string = "abced"    k = 4     print(encodedChar(string, k)) # This code is contributed# by Rituraj Jain
// C# program to find K'th character in// decrypted stringusing System; class GFG{ // Function to find K'th character in// Encoded Stringstatic char encodedChar(char[] str, int k){    int i, j;     int n = str.Length;     // To store length of substring    int len;     // To store length of substring when    // it is repeated    int num;     // To store frequency of substring    int freq;     i = 0;     while (i < n)    {        j = i;        len = 0;        freq = 0;         // Find length of substring by        // traversing the string until        // no digit is found.        while (j < n && char.IsLetter(str[j]))        {            j++;            len++;        }         // Find frequency of preceding substring.        while (j < n && char.IsDigit(str[j]))        {            freq = freq * 10 + (str[j] - '0');            j++;        }         // Find length of substring when        // it is repeated.        num = freq * len;         // If length of repeated substring is less than        // k then required character is present in next        // substring. Subtract length of repeated        // substring from k to keep account of number of        // characters required to be visited.        if (k > num)        {            k -= num;            i = j;        }         // If length of repeated substring is        // more or equal to k then required        // character lies in current substring.        else        {            k--;            k %= len;            return str[i + k];        }    }     // This is for the case when there    // are no repetition in string.    // e.g. str="abced".    return str[k - 1];} // Driver Codepublic static void Main(String[] args){    String str = "abced";    int k = 4;     Console.WriteLine(encodedChar(str.ToCharArray(), k));}} // This code is contributed by PrinciRaj1992
<script> // Javascript program to find K'th character in// decrypted string // Function to find K'th character in// Encoded Stringfunction encodedChar(str, k){    var i, j;     var n = str.length;     // To store length of substring    var len;     // To store length of substring when    // it is repeated    var num;     // To store frequency of substring    var freq;     i = 0;     while (i < n)    {        j = i;        len = 0;        freq = 0;         // Find length of substring by        // traversing the string until        // no digit is found.        while (j < n && str[j].match(/^[0-9a-z]+$/))        {            j++;            len++;        }         // Find frequency of preceding substring.        while (j < n && str[j].match(/^[0-9]+$/))        {            freq = freq * 10 + (str[j] - '0');            j++;        }         // Find length of substring when        // it is repeated.        num = freq * len;         // If length of repeated substring is less than        // k then required character is present in next        // substring. Subtract length of repeated        // substring from k to keep account of number of        // characters required to be visited.        if (k > num)        {            k -= num;            i = j;        }         // If length of repeated substring is        // more or equal to k then required        // character lies in current substring.        else        {            k--;            k %= len;            return str[i + k];        }    }     // This is for the case when there    // are no repetition in string.    // e.g. str="abced".    return str[k - 1];} // Driver Codevar str = "abced";var k = 4; document.write(encodedChar(str, k)); // This code is contributed by rutvik_56 </script>
e
 
Time Complexity: O(n) Auxiliary Space: O(1) 
rituraj_jain
29AjayKumar
princiraj1992
rutvik_56
encoding-decoding
String-Run Length Encoding
Data Structures
Strings
Data Structures
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Introduction to Algorithms
How to Start Learning DSA?
Hash Map in Python
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Longest Common Subsequence | DP-4