Given two positive integers N and K, the task is to find the Kth character of a string obtained by performing the following operation on a string S( initially “A”) N times.
Every ith operation generates following string (Si):
Si = Si – 1 + ‘B’ + rev(comp(Si – 1))
where,
comp() denotes the complement of string i.e., A is changed to B and B is changed to A.
and rev() returns the reverse of a string.
Examples:
Input: N = 3, K = 1
Output: A
Explanation:
Initially, after first operation, S1 = “A”
After 2nd operation, S2 = “ABB”
After 3rd operation, S3 = “ABBBAAB”
The first character of S3 is ‘A’.
Input: N = 2, K = 3
Output: B
Approach: The idea is to use recursion to generate the new string from the previously generated string and to repeat the process until N operations are performed. Below are the steps:
- Initialize two string prev as “A” and curr as an empty string.
- If N = 1 then returns prev otherwise perform below operation.
- Iterate a loop (N – 1) times, each time update curr as prev + “B”.
- Reverse the string prev.
- Again update the string curr string as curr + prev.
- Update string prev as curr.
- After the above steps return the (K – 1)th character of the string curr.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to return Kth character // from recursive string char findKthChar( int n, int k) { string prev = "A" ; string cur = "" ; // If N is 1 then return A if (n == 1) { return 'A' ; } // Iterate a loop and generate // the recursive string for ( int i = 2; i <= n; i++) { // Update current string cur = prev + "B" ; // Change A to B and B to A for ( int i = 0; i < prev.length(); i++) { if (prev[i] == 'A' ) { prev[i] = 'B' ; } else { prev[i] = 'A' ; } } // Reverse the previous string reverse(prev.begin(), prev.end()); cur += prev; prev = cur; } // Return the kth character return cur[k - 1]; } // Driver Code int main() { int N = 4; int K = 3; cout << findKthChar(N, K); return 0; } |
Java
// Java program for // the above approach import java.util.*; class GFG{ // String reverse static String reverse(String input) { char [] a = input.toCharArray(); int l, r = a.length - 1 ; for (l = 0 ; l < r; l++, r--) { char temp = a[l]; a[l] = a[r]; a[r] = temp; } return String.valueOf(a); } // Function to return Kth character // from recursive String static char findKthChar( int n, int k) { String prev = "A" ; String cur = "" ; // If N is 1 then return A if (n == 1 ) { return 'A' ; } // Iterate a loop and generate // the recursive String for ( int j = 2 ; j <= n; j++) { // Update current String cur = prev + "B" ; // Change A to B and B to A for ( int i = 0 ; i < prev.length(); i++) { if (prev.charAt(i) == 'A' ) { prev.replace(prev.charAt(i), 'B' ); } else { prev.replace(prev.charAt(i), 'A' ); } } // Reverse the previous String prev = reverse(prev); cur += prev; prev = cur; } // Return the kth character return cur.charAt(k); } // Driver Code public static void main(String[] args) { int N = 4 ; int K = 3 ; System.out.print(findKthChar(N, K)); } } // This code is contributed by Rajput-Ji |
Python3
# Python3 program for the above approach # Function to return Kth character # from recursive string def findKthChar(n, k): prev = "A" cur = "" # If N is 1 then return A if (n = = 1 ): return 'A' # Iterate a loop and generate # the recursive string for i in range ( 2 , n + 1 ): # Update current string cur = prev + "B" # Change A to B and B to A temp1 = [y for y in prev] for i in range ( len (prev)): if (temp1[i] = = 'A' ): temp1[i] = 'B' else : temp1[i] = 'A' # Reverse the previous string temp1 = temp1[:: - 1 ] prev = "".join(temp1) cur + = prev prev = cur # Return the kth character return cur[k - 1 ] # Driver Code if __name__ = = '__main__' : N = 4 K = 3 print (findKthChar(N, K)) # This code is contributed by mohit kumar 29 |
C#
// C# program for // the above approach using System; class GFG{ // String reverse static String reverse(String input) { char [] a = input.ToCharArray(); int l, r = a.Length - 1; for (l = 0; l < r; l++, r--) { char temp = a[l]; a[l] = a[r]; a[r] = temp; } return String.Join( "" , a); } // Function to return Kth character // from recursive String static char findKthChar( int n, int k) { String prev = "A" ; String cur = "" ; // If N is 1 then return A if (n == 1) { return 'A' ; } // Iterate a loop and generate // the recursive String for ( int j = 2; j <= n; j++) { // Update current String cur = prev + "B" ; // Change A to B and B to A for ( int i = 0; i < prev.Length; i++) { if (prev[i] == 'A' ) { prev.Replace(prev[i], 'B' ); } else { prev.Replace(prev[i], 'A' ); } } // Reverse the previous String prev = reverse(prev); cur += prev; prev = cur; } // Return the kth character return cur[k]; } // Driver Code public static void Main(String[] args) { int N = 4; int K = 3; Console.Write(findKthChar(N, K)); } } // This code is contributed by Rajput-Ji |
Javascript
<script> // Javascript program for the above approach // String reverse function reverse(input) { let a = input.split( '' ); let l, r = a.length - 1; for (l = 0; l < r; l++, r--) { let temp = a[l]; a[l] = a[r]; a[r] = temp; } return a.join( "" ); } // Function to return Kth character // from recursive String function findKthChar(n, k) { let prev = "A" ; let cur = "" ; // If N is 1 then return A if (n == 1) { return 'A' ; } // Iterate a loop and generate // the recursive String for (let j = 2; j <= n; j++) { // Update current String cur = prev + "B" ; // Change A to B and B to A for (let i = 0; i < prev.length; i++) { if (prev[i] == 'A' ) { prev[prev[i]] = 'B' ; } else { prev[prev[i]] = 'A' ; } } // Reverse the previous String prev = reverse(prev); cur += prev; prev = cur; } // Return the kth character return cur[k]; } let N = 4; let K = 3; document.write(findKthChar(N, K)); // This code is contributed by mukesh07. </script> |
B
Time Complexity: O(N2)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!