Open In App

Maximum bitwise OR one of any two Substrings of given Binary String

Improve
Improve
Like Article
Like
Save
Share
Report

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.
  • Return str2 as the required answer,

Below is the implementation of the above approach.

C++




// 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




// 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


Python3




# 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#




// 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




// 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


Output

1111110

Time Complexity: O(N), where N is the length of the string.
Auxiliary Space: O(N)



Last Updated : 28 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads