Given a binary string str, the task is to find the maximum possible OR value of any two substrings of the binary string str.
Examples:
Input: str = “1110010”
Output: “1111110”
Explanation: On choosing the substring “1110010” and “11100” we get the OR value as “1111110” which is the maximum value.Input: str = “11010”
Output: “11111”
Explanation: On choosing the substring “11010” and “101” we get the OR value as “11111” which is the maximum value.
Approach: This can be solved using the following idea.
We can consider the whole string as one of the substring and the other substring should be chosen in such a way that the most significant 0th bit should be set as 1 so that the value get maximised.
Follow the steps mentioned below to solve the problem:
- Remove the leading 0s from the string str.
- Now traverse through the rest of the array and store that in another string (say str1).
- Initialize another string (say str2) to store the maximum possible bitwise OR.
- Find the most significant bit with value ‘0’ (say k) in str1.
- Also, keep on adding the ‘1’s in str2 till k is reached.
- If k is the end of the string, return str1 as the answer [because it has all the bits set].
- Otherwise, str1 will be right shifted that many times such that the most significant setbit is at the same position as k.
- Now find the OR of these two strings in the following way:
- Iterate from i = 0 to size of str1:
- If any bit between str1[i] and str1[k] is set, append ‘1’ to str2.
- Otherwise, append ‘0’.
- Increment k. If k reaches m, stop the iteration.
- Iterate from i = 0 to size of str1:
- Return str2 as the required answer,
Below is the implementation of the above approach.
// C++ code to implement the approach #include <bits/stdc++.h> using namespace std;
// Function to find the maximum profit string findmax_ORvalue(string str) { // Initialize the variable n as
// length of the string
int i, j, n = str.length();
string str2 = "" , str1 = "" ;
// Remove the leading zeros from the
// string str traveling through the
// string until first '1' occurs
for (i = 0; i < n; i++) {
// Add all the characters
// remaining from i to n-1
if (str[i] == '1' ) {
for (j = i; j < n; j++) {
str1 += str[j];
}
break ;
}
}
// If i == n it means all are 0's in
// the string so return 0
if (i == n) {
return "0" ;
}
int k, m = str1.size();
// Traverse through the string and find
// the index where the first most
// significant zero occurs
for (k = 0; k < m; k++) {
if (str1[k] == '0' ) {
break ;
}
str2 += str1[k];
}
if (k == m)
return str2;
// Loop to find the maximum OR value
for (i = 0; i < m and k < m; i++, k++) {
if (str1[i] == '1' or str1[k] == '1' )
str2 += '1' ;
else
str2 += '0' ;
}
// Return the maximum OR value
return str2;
} // Driver function int main()
{ string str = "1110010" ;
// Function call
cout << findmax_ORvalue(str);
return 0;
} |
// Java implementation import java.io.*;
class GFG {
// Function to find the maximum profit
static public String findmax_ORvalue(String str)
{
// Initialize the variable n as
// length of the string
int i, j, n = str.length();
String str2 = "" , str1 = "" ;
// Remove the leading zeros from the
// string str traveling through the
// string until first '1' occurs
for (i = 0 ; i < n; i++) {
// Add all the characters
// remaining from i to n-1
if (str.charAt(i) == '1' ) {
for (j = i; j < n; j++) {
str1 += str.charAt(j);
}
break ;
}
}
// If i == n it means all are 0's in
// the string so return 0
if (i == n) {
return "0" ;
}
int k, m = str1.length();
// Traverse through the string and find
// the index where the first most
// significant zero occurs
for (k = 0 ; k < m; k++) {
if (str1.charAt(k) == '0' ) {
break ;
}
str2 += str1.charAt(k);
}
if (k == m)
return str2;
// Loop to find the maximum OR value
for (i = 0 ; i < m && k < m; i++, k++) {
if (str1.charAt(i) == '1'
|| str1.charAt(k) == '1' )
str2 += '1' ;
else
str2 += '0' ;
}
// Return the maximum OR value
return str2;
}
public static void main(String[] args)
{
String str = "1110010" ;
// Function call
System.out.println(findmax_ORvalue(str));
}
} // This code is contributed by lokesh |
# Python code to implement the approach # Function to find the maximum profit def findmax_ORvalue(s):
# Initialize the variable n as
# length of the string
i, j, n = 0 , 0 , len (s)
str2, str1 = " ", " "
# Remove the leading zeros from the
# string str traveling through the
# string until first '1' occurs
for i in range (n):
# Add all the characters
# remaining from i to n-1
if s[i] = = '1' :
for j in range (i, n):
str1 + = s[j]
break
# If i == n it means all are 0's in
# the string so return 0
if i = = n:
return "0"
k, m = 0 , len (str1)
# Traverse through the string and find
# the index where the first most
# significant zero occurs
for k in range (m):
if str1[k] = = '0' :
break
str2 + = str1[k]
if k = = m:
return str2
# Loop to find the maximum OR value
for i in range ( 0 , m):
if (k > = m):
break
if str1[i] = = '1' or str1[k] = = '1' :
str2 + = '1'
else :
str2 + = '0'
k + = 1
# Return the maximum OR value
return str2
# Driver function s = "1110010"
# Function call print (findmax_ORvalue(s))
# This code is contributed by Tapesh(tapeshdua420) |
// C# implementation using System;
public class GFG {
// Function to find the maximum profit
static public string findmax_ORvalue( string str)
{
// Initialize the variable n as
// length of the string
int i, j, n = str.Length;
string str2 = "" , str1 = "" ;
// Remove the leading zeros from the
// string str traveling through the
// string until first '1' occurs
for (i = 0; i < n; i++) {
// Add all the characters
// remaining from i to n-1
if (str[i] == '1' ) {
for (j = i; j < n; j++) {
str1 += str[j];
}
break ;
}
}
// If i == n it means all are 0's in
// the string so return 0
if (i == n) {
return "0" ;
}
int k, m = str1.Length;
// Traverse through the string and find
// the index where the first most
// significant zero occurs
for (k = 0; k < m; k++) {
if (str1[k] == '0' ) {
break ;
}
str2 += str1[k];
}
if (k == m)
return str2;
// Loop to find the maximum OR value
for (i = 0; i < m && k < m; i++, k++) {
if (str1[i] == '1' || str1[k] == '1' )
str2 += '1' ;
else
str2 += '0' ;
}
// Return the maximum OR value
return str2;
}
static public void Main()
{
string str = "1110010" ;
// Function call
Console.WriteLine(findmax_ORvalue(str));
}
} // This code is contributed by ksam24000 |
// JavaScript code to implement the approach // Function to find the maximum profit const findmax_ORvalue = (str) => { // Initialize the variable n as
// length of the string
let i, j, n = str.length;
let str2 = "" , str1 = "" ;
// Remove the leading zeros from the
// string str traveling through the
// string until first '1' occurs
for (i = 0; i < n; i++) {
// Add all the characters
// remaining from i to n-1
if (str[i] == '1' ) {
for (j = i; j < n; j++) {
str1 += str[j];
}
break ;
}
}
// If i == n it means all are 0's in
// the string so return 0
if (i == n) {
return "0" ;
}
let k, m = str1.length;
// Traverse through the string and find
// the index where the first most
// significant zero occurs
for (k = 0; k < m; k++) {
if (str1[k] == '0 ') {
break;
}
str2 += str1[k];
}
if (k == m)
return str2;
// Loop to find the maximum OR value
for (i = 0; i < m && k < m; i++, k++) {
if (str1[i] == ' 1 ' || str1[k] == ' 1 ')
str2 += ' 1 ';
else
str2 += ' 0';
}
// Return the maximum OR value
return str2;
} // Driver function let str = "1110010" ;
// Function call console.log(findmax_ORvalue(str)); // This code is contributed by rakeshsahni |
1111110
Time Complexity: O(N), where N is the length of the string.
Auxiliary Space: O(N)