Given a string S consisting of N lowercase alphabets, the task is to modify the string S by replacing each character with the alphabet whose circular distance from the character is equal to the frequency of the character in S.
Examples:
Input: S = “neveropen”
Output: hgglt
Explanation:
The following modifications are done on the string S:
- The frequency of ‘g’ in the string is 1. Therefore, ‘g’ is replaced by ‘h’.
- The frequency of ‘e’ in the string is 2. Therefore, ‘e’ is replaced by ‘g’.
- The frequency of ‘e’ in the string is 2. Therefore, ‘e’ is replaced by ‘g’.
- The frequency of ‘k’ in the string is 1. Therefore, ‘k’ is converted to ‘k’ + 1 = ‘l’.
- The frequency of ‘s’ in the string is 1. Therefore, ‘s’ is converted to ‘s’ + 1 = ‘t’.
Therefore, the modified string S is “hgglt”.
Input: S = “jazz”
Output: “kbbb”
Approach: The given problem can be solved by maintaining the frequency array that stores the occurrences of each character in the string. Follow the steps below to solve the problem:
- Initialize an array, freq[26] initially with all elements as 0 to store the frequency of each character of the string.
- Traverse the given string S and increment the frequency of each character S[i] by 1in the array freq[].
- Traverse the string S used the variable i and performed the following steps:
- Store the value to be added to S[i] in a variable, add as (freq[i] % 26).
- If, after adding the value of add to S[i], S[i] does not exceed the character z, then update S[i] to S[i] + add.
- Otherwise, update the value of add to (S[i] + add – z) and then set S[i] to (a + add – 1).
- After completing the above steps, print the modified string S.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to modify string by replacing // characters by the alphabet present at // distance equal to frequency of the string void addFrequencyToCharacter(string s) { // Stores frequency of characters int frequency[26] = { 0 }; // Stores length of the string int n = s.size(); // Traverse the given string S for ( int i = 0; i < n; i++) { // Increment frequency of // current character by 1 frequency[s[i] - 'a' ] += 1; } // Traverse the string for ( int i = 0; i < n; i++) { // Store the value to be added // to the current character int add = frequency[s[i] - 'a' ] % 26; // Check if after adding the // frequency, the character is // less than 'z' or not if ( int (s[i]) + add <= int ( 'z' )) s[i] = char ( int (s[i]) + add); // Otherwise, update the value of // add so that s[i] doesn't exceed 'z' else { add = ( int (s[i]) + add) - ( int ( 'z' )); s[i] = char ( int ( 'a' ) + add - 1); } } // Print the modified string cout << s; } // Driver Code int main() { string str = "neveropen" ; addFrequencyToCharacter(str); return 0; } |
Java
// Java program for the above approach class GFG{ // Function to modify string by replacing // characters by the alphabet present at // distance equal to frequency of the string static void addFrequencyToCharacter( char [] s) { // Stores frequency of characters int frequency[] = new int [ 26 ]; // Stores length of the string int n = s.length; // Traverse the given string S for ( int i = 0 ; i < n; i++) { // Increment frequency of // current character by 1 frequency[s[i] - 'a' ] += 1 ; } // Traverse the string for ( int i = 0 ; i < n; i++) { // Store the value to be added // to the current character int add = frequency[s[i] - 'a' ] % 26 ; // Check if after adding the // frequency, the character is // less than 'z' or not if (( int )(s[i]) + add <= ( int )( 'z' )) s[i] = ( char )(( int )(s[i]) + add); // Otherwise, update the value of // add so that s[i] doesn't exceed 'z' else { add = (( int )(s[i]) + add) - (( int )( 'z' )); s[i] = ( char )(( int )( 'a' ) + add - 1 ); } } // Print the modified string System.out.println(s); } // Driver Code public static void main(String[] args) { String str = "neveropen" ; addFrequencyToCharacter(str.toCharArray()); } } // This code is contributed by AnkThon |
Python3
# Python3 program for the above approach # Function to modify string by replacing # characters by the alphabet present at # distance equal to frequency of the string def addFrequencyToCharacter(s): # Stores frequency of characters frequency = [ 0 ] * 26 # Stores length of the string n = len (s) # Traverse the given string S for i in range (n): # Increment frequency of # current character by 1 frequency[ ord (s[i]) - ord ( 'a' )] + = 1 # Traverse the string for i in range (n): # Store the value to be added # to the current character add = frequency[ ord (s[i]) - ord ( 'a' )] % 26 # Check if after adding the # frequency, the character is # less than 'z' or not if ( ord (s[i]) + add < = ord ( 'z' )): s[i] = chr ( ord (s[i]) + add) # Otherwise, update the value of # add so that s[i] doesn't exceed 'z' else : add = ( ord (s[i]) + add) - ( ord ( 'z' )) s[i] = chr ( ord ( 'a' ) + add - 1 ) # Print the modified string print ("".join(s)) # Driver Code if __name__ = = '__main__' : str = "neveropen" addFrequencyToCharacter([i for i in str ]) # This code is contributed by mohit kumar 29 |
C#
// C# program for the above approach using System; class GFG{ // Function to modify string by replacing // characters by the alphabet present at // distance equal to frequency of the string static void addFrequencyToCharacter( char [] s) { // Stores frequency of characters int [] frequency = new int [26]; // Stores length of the string int n = s.Length; // Traverse the given string S for ( int i = 0; i < n; i++) { // Increment frequency of // current character by 1 frequency[s[i] - 'a' ] += 1; } // Traverse the string for ( int i = 0; i < n; i++) { // Store the value to be added // to the current character int add = frequency[s[i] - 'a' ] % 26; // Check if after adding the // frequency, the character is // less than 'z' or not if (( int )(s[i]) + add <= ( int )( 'z' )) s[i] = ( char )(( int )(s[i]) + add); // Otherwise, update the value of // add so that s[i] doesn't exceed 'z' else { add = (( int )(s[i]) + add) - (( int )( 'z' )); s[i] = ( char )(( int )( 'a' ) + add - 1); } } // Print the modified string Console.WriteLine(s); } // Driver Code public static void Main( string [] args) { string str = "neveropen" ; addFrequencyToCharacter(str.ToCharArray()); } } // This code is contributed by ukasp |
Javascript
<script> // JavaScript program for the above approach // Function to modify string by replacing // characters by the alphabet present at // distance equal to frequency of the string function addFrequencyToCharacter(s) { // Stores frequency of characters var frequency = new Array(26).fill(0); // Stores length of the string var n = s.length; // Traverse the given string S for ( var i = 0; i < n; i++) { // Increment frequency of // current character by 1 frequency[s[i].charCodeAt(0) - "a" .charCodeAt(0)] += 1; } // Traverse the string for ( var i = 0; i < n; i++) { // Store the value to be added // to the current character var add = frequency[s[i].charCodeAt(0) - "a" .charCodeAt(0)] % 26; // Check if after adding the // frequency, the character is // less than 'z' or not if (s[i].charCodeAt(0) + add <= "z" .charCodeAt(0)) s[i] = String.fromCharCode(s[i].charCodeAt(0) + add); // Otherwise, update the value of // add so that s[i] doesn't exceed 'z' else { add = s[i].charCodeAt(0) + add - "z" .charCodeAt(0); s[i] = String.fromCharCode( "a" .charCodeAt(0) + add - 1); } } // Print the modified string document.write(s.join( "" ) + "<br>" ); } // Driver Code var str = "neveropen" ; addFrequencyToCharacter(str.split( "" )); </script> |
hgglt
Time Complexity: O(N) //since there is only one loop to carry out the operations the overall time complexity turns out to be O(N)
Auxiliary Space: O(1) //since there is no extra array or data structure used, it takes constant space.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!