Open In App

Minimize Suffix flip to make Binary String non decreasing

Improve
Improve
Like Article
Like
Save
Share
Report

Given a binary string str, the task is to find the minimum operations required to convert the binary string in a non-decreasing manner such that in each operation an index i is chosen and all bits right to it are flipped.

Examples:

Input: str = “100010”
Output: 3
Explanation: On flipping at index 0 it becomes 111101. 
On flipping at the index at index 3 it becomes 111110. 
On flipping at index 4 it becomes 111111, i.e., non-decreasing 
So the minimum operations required are 3.

Input: str = “00001111”
Output: 0
Explanation: The string is already in non-decreasing order so 0 operations are required.

Naive Approach: This problem can be solved using the following idea:

At index i, where previous character at index i-1 is different, there will be having two choices: 

  • Change all the right bits from i to n-1 and increase the count of operations.
  • Ignoring this bit and iterate further.

Follow the steps mentioned below to solve the problem:

  • Initialize a variable res =0 to count the minimum operation.
  • Iterate through the string and check if the character at index i is equal to the previous character or not.
    • If not, either flip all the right bits from that index i or ignore that index and iterate further.
    • If all the right bits are flipped, increment the res.
  • Return the res.

Time Complexity: O(2(N*N))
Auxiliary Space: O(1)

Efficient Approach: This can be solved using the following idea:

At index i, where previous character at index i – 1 is different,  just maintain a flag to check whether flip has occurred or not before and increase the count of operations. 

Follow the steps mentioned below to solve the problem:

  • Initialize a variable res = 0 to count the minimum operations and flag = 0 to check if the flip has occurred before.
  • Iterate through the string and check if the character at index i is equal to the previous character or not.
    • If not, and flag = 0 and the current character is ‘0’, it means it is a decreasing sequence and it needs to be flipped.
    • So make the flag = 1 and increment the res.
    • Else if flag = 1 there is a flip before and so the result should be incremented since the present and previous are not equal.
  • Return the res.

Below is the implementation of the above approach.

C++




// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to count minimum operations
int minOperations(string str)
{
    // Initialize res = 0 to store the minimum
    // operations required
    int res = 0;
 
    // Initialize a flag to check flip
    // has occurred or not before
    bool flag = 0;
 
    for (int i = 1; i < str.length(); i++) {
 
        // If two adjacent are not equal
        if (str[i] != str[i - 1]) {
 
            // If it is decreasing and flag = 0
            // then  make flag = 1 and flip by
            // incrementing operations
            if (flag == 0 && str[i] == '0') {
                flag = 1;
                res++;
            }
 
            // If it is already flipped before
            // increment the operations since
            // two adjacent are not same
            else if (flag == 1) {
                res++;
            }
        }
    }
 
    // Return the minimum operations required
    return res;
}
 
// Driver code
int main()
{
    string str = "100010";
 
    // Function call
    cout << minOperations(str);
 
    return 0;
}


Java




// Java code to implement the approach
import java.io.*;
 
class GFG
{
   
  // Function to count minimum operations
  public static int minOperations(String str)
  {
     
    // Initialize res = 0 to store the minimum
    // operations required
    int res = 0;
 
    // Initialize a flag to check flip
    // has occurred or not before
    int flag = 0;
 
    for (int i = 1; i < str.length(); i++) {
 
      // If two adjacent are not equal
      if (str.charAt(i) != str.charAt(i - 1)) {
 
        // If it is decreasing and flag = 0
        // then  make flag = 1 and flip by
        // incrementing operations
        if (flag == 0 && str.charAt(i) == '0') {
          flag = 1;
          res++;
        }
 
        // If it is already flipped before
        // increment the operations since
        // two adjacent are not same
        else if (flag == 1) {
          res++;
        }
      }
    }
 
    // Return the minimum operations required
    return res;
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    String str = "100010";
 
    // Function call
    System.out.print(minOperations(str));
  }
}
 
// This code is contributed by Rohit Pradhan


Python3




# Python code to implement the approach
 
# Function to count minimum operations
def minOperations(str):
   
    # Initialize res = 0 to store the minimum
    # operations required
    res = 0
 
    # Initialize a flag to check flip
    # has occurred or not before
    flag = 0
 
    for i in range(1, len(str)):
       
        # If two adjacent are not equal
        if(str[i] != str[i-1]):
           
            # If it is decreasing and flag = 0
            # then  make flag = 1 and flip by
            # incrementing operations
            if(flag == 0 and str[i] == '0'):
                flag = 1
                res += 1
                 
            # If it is already flipped before
            # increment the operations since
            # two adjacent are not same
            elif(flag == 1):
                res += 1
 
    # return the minimum operations required
    return res
 
str = "100010"
 
# Function call
print(minOperations(str))
 
# This code is contributed by lokesh


C#




// C# code to implement the approach
using System;
 
public class GFG{
     
    // Function to count minimum operations
public static int minOperations(string str)
{
     
    // Initialize res = 0 to store the minimum
    // operations required
    int res = 0;
 
    // Initialize a flag to check flip
    // has occurred or not before
    int flag = 0;
 
    for (int i = 1; i < str.Length; i++) {
 
    // If two adjacent are not equal
    if (str[i] != str[i - 1]) {
 
        // If it is decreasing and flag = 0
        // then make flag = 1 and flip by
        // incrementing operations
        if (flag == 0 && str[i] == '0') {
        flag = 1;
        res++;
        }
 
        // If it is already flipped before
        // increment the operations since
        // two adjacent are not same
        else if (flag == 1) {
        res++;
        }
    }
    }
 
    // Return the minimum operations required
    return res;
}
 
     
    // Driver Code
    static public void Main (){
        string str = "100010";
 
    // Function call
    Console.WriteLine(minOperations(str));
    }
}
 
// This code is contributed by Pushpesh Raj.


Javascript




// JavaScript code to implement the approach
 
// Function to count minimum operations
const minOperations = (str) => {
 
    // Initialize res = 0 to store the minimum
    // operations required
    let res = 0;
 
    // Initialize a flag to check flip
    // has occurred or not before
    let flag = 0;
 
    for (let i = 1; i < str.length; i++) {
 
        // If two adjacent are not equal
        if (str[i] != str[i - 1]) {
 
            // If it is decreasing and flag = 0
            // then make flag = 1 and flip by
            // incrementing operations
            if (flag == 0 && str[i] == '0') {
                flag = 1;
                res++;
            }
 
            // If it is already flipped before
            // increment the operations since
            // two adjacent are not same
            else if (flag == 1) {
                res++;
            }
        }
    }
 
    // Return the minimum operations required
    return res;
}
 
// Driver code
str = "100010";
 
// Function call
console.log(minOperations(str));
 
// This code is contributed by rakeshsahni


Output

3

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



Last Updated : 13 Dec, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads