Most frequent character in a string after replacing all occurrences of X in a Binary String
Last Updated : 28 Sep, 2022
Given a string S of length N consisting of 1, 0, and X, the task is to print the character ('1' or '0') with the maximum frequency after replacing every occurrence of X as per the following conditions:
- If the character present adjacently to the left of X is 1, replace X with 1.
- If the character present adjacently to the right of X is 0, replace X with 0.
- If both the above conditions are satisfied, X remains unchanged.
Note: If the frequency of 1 and 0 is the same after replacements, then print X.
Examples:
Input: S = "XX10XX10XXX1XX"
Output: 1
Explanation:
Operation 1: S = "X11001100X1XX"
Operation 2: S = "111001100X1XX"
No further replacements are possible.
Hence, the frequencies of '1' and '0' are 6 and 4 respectively.
Input: S = "0XXX1"
Output: X
Explanation:
Operation 1: S = "00X11"
No further replacements are possible.
Hence, the frequencies of both '1' and '0' are 2.
Approach: The given problem can be solved based on the following observations:
- All the 'X's lying between '1' and '0' (e.g. 1XXX0) is of no significance because neither of '1' and '0' can convert it.
- All the 'X's lying between '0' and '1' (e.g. 0XXX1) is also of no significance because it will contribute equally to both 1 and 0. Consider any substring of the form "0X....X1", then after changing the first occurrence of X from the start and the end of the string, the actual frequency of 0 and 1 in the substring remains unchanged.
From the above observations it can be concluded that the result depends upon the following conditions:
- The count of '1' and '0' in the original string.
- The frequency of X that are present between two consecutive 0s or two consecutive 1s, i.e. "0XXX0" and "1XXXX1" respectively.
- The number of continuous 'X' which are present at the starting of string and has a right end '1', i.e. "XXXX1.....".
- The number of continuous 'X's which are present at end of the string and has a left end '0' i.e., .....0XXX.
Hence, count the number of 1s and 0s as per the above conditions and print the resultant count.
Below is the implementation of the above approach:
C++ // C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the most frequent // character after replacing X with // either '0' or '1' according as per // the given conditions void maxOccurringCharacter(string s) { // Store the count of 0s and // 1s in the string S int count0 = 0, count1 = 0; // Count the frequency of // 0 and 1 for (int i = 0; i < s.length(); i++) { // If the character is 1 if (s[i] == '1') { count1++; } // If the character is 0 else if (s[i] == '0') { count0++; } } // Stores first occurrence of 1 int prev = -1; for (int i = 0; i < s.length(); i++) { if (s[i] == '1') { prev = i; break; } } // Traverse the string to count // the number of X between two // consecutive 1s for (int i = prev + 1; i < s.length(); i++) { // If the current character // is not X if (s[i] != 'X') { // If the current character // is 1, add the number of // Xs to count1 and set // prev to i if (s[i] == '1') { count1 += i - prev - 1; prev = i; } // Otherwise else { // Find next occurrence // of 1 in the string bool flag = true; for (int j = i + 1; j < s.length(); j++) { if (s[j] == '1') { flag = false; prev = j; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break // out of the loop else { i = s.length(); } } } } // Store the first occurrence of 0 prev = -1; for (int i = 0; i < s.length(); i++) { if (s[i] == '0') { prev = i; break; } } // Repeat the same procedure to // count the number of X between // two consecutive 0s for (int i = prev + 1; i < s.length(); i++) { // If the current character is not X if (s[i] != 'X') { // If the current character is 0 if (s[i] == '0') { // Add the count of Xs to count0 count0 += i - prev - 1; // Set prev to i prev = i; } // Otherwise else { // Find the next occurrence // of 0 in the string bool flag = true; for (int j = i + 1; j < s.length(); j++) { if (s[j] == '0') { prev = j; flag = false; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break out // of the loop else { i = s.length(); } } } } // Count number of X present in // the starting of the string // as XXXX1... if (s[0] == 'X') { // Store the count of X int count = 0; int i = 0; while (s[i] == 'X') { count++; i++; } // Increment count1 by // count if the condition // is satisfied if (s[i] == '1') { count1 += count; } } // Count the number of X // present in the ending of // the string as ...XXXX0 if (s[(s.length() - 1)] == 'X') { // Store the count of X int count = 0; int i = s.length() - 1; while (s[i] == 'X') { count++; i--; } // Increment count0 by // count if the condition // is satisfied if (s[i] == '0') { count0 += count; } } // If count of 1 is equal to // count of 0, print X if (count0 == count1) { cout << "X" << endl; } // Otherwise, if count of 1 // is greater than count of 0 else if (count0 > count1) { cout << 0 << endl; } // Otherwise, print 0 else cout << 1 << endl; } // Driver Code int main() { string S = "XX10XX10XXX1XX"; maxOccurringCharacter(S); } // This code is contributed by SURENDAR_GANGWAR.
Java // Java program for the above approach import java.io.*; class GFG { // Function to find the most frequent // character after replacing X with // either '0' or '1' according as per // the given conditions public static void maxOccurringCharacter(String s) { // Store the count of 0s and // 1s in the string S int count0 = 0, count1 = 0; // Count the frequency of // 0 and 1 for (int i = 0; i < s.length(); i++) { // If the character is 1 if (s.charAt(i) == '1') { count1++; } // If the character is 0 else if (s.charAt(i) == '0') { count0++; } } // Stores first occurrence of 1 int prev = -1; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '1') { prev = i; break; } } // Traverse the string to count // the number of X between two // consecutive 1s for (int i = prev + 1; i < s.length(); i++) { // If the current character // is not X if (s.charAt(i) != 'X') { // If the current character // is 1, add the number of // Xs to count1 and set // prev to i if (s.charAt(i) == '1') { count1 += i - prev - 1; prev = i; } // Otherwise else { // Find next occurrence // of 1 in the string boolean flag = true; for (int j = i + 1; j < s.length(); j++) { if (s.charAt(j) == '1') { flag = false; prev = j; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break // out of the loop else { i = s.length(); } } } } // Store the first occurrence of 0 prev = -1; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '0') { prev = i; break; } } // Repeat the same procedure to // count the number of X between // two consecutive 0s for (int i = prev + 1; i < s.length(); i++) { // If the current character is not X if (s.charAt(i) != 'X') { // If the current character is 0 if (s.charAt(i) == '0') { // Add the count of Xs to count0 count0 += i - prev - 1; // Set prev to i prev = i; } // Otherwise else { // Find the next occurrence // of 0 in the string boolean flag = true; for (int j = i + 1; j < s.length(); j++) { if (s.charAt(j) == '0') { prev = j; flag = false; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break out // of the loop else { i = s.length(); } } } } // Count number of X present in // the starting of the string // as XXXX1... if (s.charAt(0) == 'X') { // Store the count of X int count = 0; int i = 0; while (s.charAt(i) == 'X') { count++; i++; } // Increment count1 by // count if the condition // is satisfied if (s.charAt(i) == '1') { count1 += count; } } // Count the number of X // present in the ending of // the string as ...XXXX0 if (s.charAt(s.length() - 1) == 'X') { // Store the count of X int count = 0; int i = s.length() - 1; while (s.charAt(i) == 'X') { count++; i--; } // Increment count0 by // count if the condition // is satisfied if (s.charAt(i) == '0') { count0 += count; } } // If count of 1 is equal to // count of 0, print X if (count0 == count1) { System.out.println("X"); } // Otherwise, if count of 1 // is greater than count of 0 else if (count0 > count1) { System.out.println(0); } // Otherwise, print 0 else System.out.println(1); } // Driver Code public static void main(String[] args) { String S = "XX10XX10XXX1XX"; maxOccurringCharacter(S); } }
Python3 # Python program for the above approach # Function to find the most frequent # character after replacing X with # either '0' or '1' according as per # the given conditions def maxOccurringCharacter(s): # Store the count of 0s and # 1s in the S count0 = 0 count1 = 0 # Count the frequency of # 0 and 1 for i in range(len(s)): # If the character is 1 if (s[i] == '1') : count1 += 1 # If the character is 0 elif (s[i] == '0') : count0 += 1 # Stores first occurrence of 1 prev = -1 for i in range(len(s)): if (s[i] == '1') : prev = i break # Traverse the to count # the number of X between two # consecutive 1s for i in range(prev + 1, len(s)): # If the current character # is not X if (s[i] != 'X') : # If the current character # is 1, add the number of # Xs to count1 and set # prev to i if (s[i] == '1') : count1 += i - prev - 1 prev = i # Otherwise else : # Find next occurrence # of 1 in the string flag = True for j in range(i+1, len(s)): if (s[j] == '1') : flag = False prev = j break # If it is found, # set i to prev if (flag == False) : i = prev # Otherwise, break # out of the loop else : i = len(s) # Store the first occurrence of 0 prev = -1 for i in range(0, len(s)): if (s[i] == '0') : prev = i break # Repeat the same procedure to # count the number of X between # two consecutive 0s for i in range(prev + 1, len(s)): # If the current character is not X if (s[i] != 'X') : # If the current character is 0 if (s[i] == '0') : # Add the count of Xs to count0 count0 += i - prev - 1 # Set prev to i prev = i # Otherwise else : # Find the next occurrence # of 0 in the string flag = True for j in range(i + 1, len(s)): if (s[j] == '0') : prev = j flag = False break # If it is found, # set i to prev if (flag == False) : i = prev # Otherwise, break out # of the loop else : i = len(s) # Count number of X present in # the starting of the string # as XXXX1... if (s[0] == 'X') : # Store the count of X count = 0 i = 0 while (s[i] == 'X') : count += 1 i += 1 # Increment count1 by # count if the condition # is satisfied if (s[i] == '1') : count1 += count # Count the number of X # present in the ending of # the as ...XXXX0 if (s[(len(s) - 1)] == 'X') : # Store the count of X count = 0 i = len(s) - 1 while (s[i] == 'X') : count += 1 i -= 1 # Increment count0 by # count if the condition # is satisfied if (s[i] == '0') : count0 += count # If count of 1 is equal to # count of 0, print X if (count0 == count1) : print("X") # Otherwise, if count of 1 # is greater than count of 0 elif (count0 > count1) : print( 0 ) # Otherwise, print 0 else: print(1) # Driver Code S = "XX10XX10XXX1XX" maxOccurringCharacter(S) # This code is contributed by sanjoy_62.
C# // C# program for the above approach using System; public class GFG { // Function to find the most frequent // character after replacing X with // either '0' or '1' according as per // the given conditions public static void maxOccurringCharacter(string s) { // Store the count of 0s and // 1s in the string S int count0 = 0, count1 = 0; // Count the frequency of // 0 and 1 for (int i = 0; i < s.Length; i++) { // If the character is 1 if (s[i] == '1') { count1++; } // If the character is 0 else if (s[i] == '0') { count0++; } } // Stores first occurrence of 1 int prev = -1; for (int i = 0; i < s.Length; i++) { if (s[i] == '1') { prev = i; break; } } // Traverse the string to count // the number of X between two // consecutive 1s for (int i = prev + 1; i < s.Length; i++) { // If the current character // is not X if (s[i] != 'X') { // If the current character // is 1, add the number of // Xs to count1 and set // prev to i if (s[i] == '1') { count1 += i - prev - 1; prev = i; } // Otherwise else { // Find next occurrence // of 1 in the string bool flag = true; for (int j = i + 1; j < s.Length; j++) { if (s[j] == '1') { flag = false; prev = j; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break // out of the loop else { i = s.Length; } } } } // Store the first occurrence of 0 prev = -1; for (int i = 0; i < s.Length; i++) { if (s[i] == '0') { prev = i; break; } } // Repeat the same procedure to // count the number of X between // two consecutive 0s for (int i = prev + 1; i < s.Length; i++) { // If the current character is not X if (s[i] != 'X') { // If the current character is 0 if (s[i] == '0') { // Add the count of Xs to count0 count0 += i - prev - 1; // Set prev to i prev = i; } // Otherwise else { // Find the next occurrence // of 0 in the string bool flag = true; for (int j = i + 1; j < s.Length; j++) { if (s[j] == '0') { prev = j; flag = false; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break out // of the loop else { i = s.Length; } } } } // Count number of X present in // the starting of the string // as XXXX1... if (s[0] == 'X') { // Store the count of X int count = 0; int i = 0; while (s[i] == 'X') { count++; i++; } // Increment count1 by // count if the condition // is satisfied if (s[i] == '1') { count1 += count; } } // Count the number of X // present in the ending of // the string as ...XXXX0 if (s[s.Length - 1] == 'X') { // Store the count of X int count = 0; int i = s.Length - 1; while (s[i] == 'X') { count++; i--; } // Increment count0 by // count if the condition // is satisfied if (s[i] == '0') { count0 += count; } } // If count of 1 is equal to // count of 0, print X if (count0 == count1) { Console.WriteLine("X"); } // Otherwise, if count of 1 // is greater than count of 0 else if (count0 > count1) { Console.WriteLine(0); } // Otherwise, print 0 else Console.WriteLine(1); } // Driver Code public static void Main(string[] args) { string S = "XX10XX10XXX1XX"; maxOccurringCharacter(S); } } // This code is contributed by AnkThon
JavaScript <script> // javascript program for the above approach // Function to find the most frequent // character after replacing X with // either '0' or '1' according as per // the given conditions function maxOccurringCharacter(s) { // Store the count of 0s and // 1s in the string S var count0 = 0, count1 = 0; // Count the frequency of // 0 and 1 for (var i = 0; i < s.length; i++) { // If the character is 1 if (s.charAt(i) == '1') { count1++; } // If the character is 0 else if (s.charAt(i) == '0') { count0++; } } // Stores first occurrence of 1 var prev = -1; for (var i = 0; i < s.length; i++) { if (s.charAt(i) == '1') { prev = i; break; } } // Traverse the string to count // the number of X between two // consecutive 1s for (var i = prev + 1; i < s.length; i++) { // If the current character // is not X if (s.charAt(i) != 'X') { // If the current character // is 1, add the number of // Xs to count1 and set // prev to i if (s.charAt(i) == '1') { count1 += i - prev - 1; prev = i; } // Otherwise else { // Find next occurrence // of 1 in the string flag = true; for (var j = i + 1; j < s.length; j++) { if (s.charAt(j) == '1') { flag = false; prev = j; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break // out of the loop else { i = s.length; } } } } // Store the first occurrence of 0 prev = -1; for (var i = 0; i < s.length; i++) { if (s.charAt(i) == '0') { prev = i; break; } } // Repeat the same procedure to // count the number of X between // two consecutive 0s for (var i = prev + 1; i < s.length; i++) { // If the current character is not X if (s.charAt(i) != 'X') { // If the current character is 0 if (s.charAt(i) == '0') { // Add the count of Xs to count0 count0 += i - prev - 1; // Set prev to i prev = i; } // Otherwise else { // Find the next occurrence // of 0 in the string flag = true; for (var j = i + 1; j < s.length; j++) { if (s.charAt(j) == '0') { prev = j; flag = false; break; } } // If it is found, // set i to prev if (!flag) { i = prev; } // Otherwise, break out // of the loop else { i = s.length; } } } } // Count number of X present in // the starting of the string // as XXXX1... if (s.charAt(0) == 'X') { // Store the count of X var count = 0; var i = 0; while (s.charAt(i) == 'X') { count++; i++; } // Increment count1 by // count if the condition // is satisfied if (s.charAt(i) == '1') { count1 += count; } } // Count the number of X // present in the ending of // the string as ...XXXX0 if (s.charAt(s.length - 1) == 'X') { // Store the count of X var count = 0; var i = s.length - 1; while (s.charAt(i) == 'X') { count++; i--; } // Increment count0 by // count if the condition // is satisfied if (s.charAt(i) == '0') { count0 += count; } } // If count of 1 is equal to // count of 0, print X if (count0 == count1) { document.write("X"); } // Otherwise, if count of 1 // is greater than count of 0 else if (count0 > count1) { document.write(0); } // Otherwise, print 0 else document.write(1); } // Driver Code var S = "XX10XX10XXX1XX"; maxOccurringCharacter(S); // This code is contributed by 29AjayKumar </script>
Time Complexity: O(N)
Auxiliary Space: O(1)
Similar Reads
Count occurrences of a character in a repeated string
Given an integer N and a lowercase string. The string is repeated infinitely. The task is to find the No. of occurrences of a given character x in first N letters.Examples: Input : N = 10 str = "abcac"Output : 4Explanation: "abcacabcac" is the substring from the infinitely repeated string. In first
8 min read
Python - Replacing Nth occurrence of multiple characters in a String with the given character
Replacing the Nth occurrence of multiple characters in a string with a given character involves identifying and counting specific character occurrences. Using a Loop and find()Using a loop and find() method allows us to search for the first occurrence of a substring within each list element. This ap
2 min read
Minimize length of a string by removing occurrences of another string from it as a substring
Given a string S and a string T, the task is to find the minimum possible length to which the string S can be reduced to after removing all possible occurrences of string T as a substring in string S. Examples: Input: S = "aabcbcbd", T = "abc"Output: 2Explanation:Removing the substring {S[1], ..., S
8 min read
Minimize removal of substring of 0s to remove all occurrences of 0s from a circular Binary String
Given circular binary string S of size N, the task is to count the minimum number of consecutive 0s required to be removed such that the string contains only 1s. A circular string is a string whose first and last characters are considered to be adjacent to each other. Examples: Input: S = "11010001"
6 min read
Find iâth index character in a binary string obtained after n iterations | Set 2
Given a decimal number m, convert it into a binary string and apply n iterations, in each iteration 0 becomes â01â and 1 becomes â10â. Find ith(based indexing) index character in the string after nth iteration.Examples: Input: m = 5 i = 5 n = 3Output: 1ExplanationIn the first case m = 5, i = 5, n =
13 min read
Convert given Strings into T by replacing characters in between strings any number of times
Given an array, arr[] of N strings and a string T of size M, the task is to check if it is possible to make all the strings in the array arr[] same as the string T by removing any character from one string, say arr[i] and inserting it at any position to another string arr[j] any number of times. Exa
9 min read
Find i'th Index character in a binary string obtained after n iterations
Given a decimal number m, convert it into a binary string and apply n iterations. In each iteration, 0 becomes "01" and 1 becomes "10". Find the (based on indexing) index character in the string after the nth iteration. Examples: Input : m = 5, n = 2, i = 3Output : 1Input : m = 3, n = 3, i = 6Output
6 min read
Count of substrings of a given Binary string with all characters same
Given binary string str containing only 0 and 1, the task is to find the number of sub-strings containing only 1s and 0s respectively, i.e all characters same. Examples: Input: str = â011âOutput: 4Explanation: Three sub-strings are "1", "1", "11" which have only 1 in them, and one substring is there
10 min read
Check if String T can be made Substring of S by replacing given characters
Given two strings S and T and a 2D array replace[][], where replace[i] = {oldChar, newChar} represents that the character oldChar of T is replaced with newChar. The task is to find if it is possible to make string T a substring of S by replacing characters according to the replace array. Note: Each
9 min read
Printing frequency of each character just after its consecutive occurrences
Given a string in such a way that every character occurs in a repeated manner. Your task is to print the string by inserting the frequency of each unique character after it and also eliminating all repeated characters. Examples: Input: GeeeEEKKKssOutput: G1e3E2K3s2 Input: ccccOddEEEOutput: c4O1d2E3
3 min read