Open In App

Minimum cost of flipping characters required to convert Binary String to 0s only

Improve
Improve
Like Article
Like
Save
Share
Report

Given binary string str, and integers A, which denotes the cost of converting consecutive 1s to 0s, and B, which denotes the cost of converting 0s to 1s. The task is to find the minimum cost to reduce the string str to 0s only.

Examples:

Input: str = “01101110”, A = 5, B = 1
Output: 6
Explanation:
Convert the str[3] to ‘1’. Cost = 1, str = “01111110”.
Convert the substring {str[1], … str[6]} to ‘0’. Cost = 5, str = “00000000”.

Input: str = “1010010011110111”, A = 12, B = 14
Output: 60

 

Approach: The given problem can be solved based on the following observations: 

For any pair of consecutive segments of 1s [L1, R1] and [L2, R2] (where L2 > R1), choose to either convert both segments to 0s for a cost of 2 * A or convert 0s between both these segments to 1s and convert [L1, R2] to 1s for a cost of A + (L2 – R1 – 1) * B.

Follow the steps below to solve the problem:

  • Initialize a variable left_1 and store the index of leftmost ‘1’ in str
  • Initialize another variable right_1 and store the index of rightmost ‘1’ in str.
  • If left_1 and right_1 do not exist, then str already consists of 0s only. Therefore, print 0 as the minimum cost
  • Otherwise, there is at least one ‘1’ in str. Therefore, initialize cost = A.
  • Iterate over the characters in string str from left_1 to right_1 with a pointer i 
    • Calculate the number of consecutive 0s to the right of i and store it in variable zeroes.
    • If the length of zeroes exceeds 0, convert 0s to 1s for a cost of zeroes * B or convert consecutive 1s to 0s for the cost of A.
    • Therefore, increment cost by min(zeroes * B, A)
  • Finally, print the minimum cost obtained.

Below is the implementation of the above approach:

C++




// C++ Program to implement
// the above approach
#include <iostream>
using namespace std;
 
// Function to find the minimum cost
// to convert given string to 0s only
void convert_to_allzeroes(string str,
                          int a, int b)
{
    // Length of string
    int len = str.length();
 
    // Stores the index of leftmost '1' in str
    int left_1, i = 0;
 
    while (i < len && str[i] == '0')
        i++;
 
    // Update the index of leftmost '1' in str
    left_1 = i;
 
    // Stores the index of rightmost '1' in str
    int right_1;
    i = len - 1;
    while (i >= 0 && str[i] == '0')
        i--;
 
    // Update the index of rightmost '1' in str
    right_1 = i;
 
    // If str does not contain any '1's
    if (left_1 == len && right_1 == -1) {
 
        // No changes required
        cout << 0;
        return;
    }
 
    // Stores minimum cost
    int cost = a, zeroes;
 
    // Iterating through str form
    // left_1 to right_1
    for (i = left_1; i <= right_1; i++) {
 
        // Stores length of
        // consecutive 0s
        zeroes = 0;
 
        // Calculate length of consecutive 0s
        while (i < len && str[i] == '0') {
 
            zeroes++;
            i++;
        }
 
        // If a substring of 0s exists
        if (zeroes)
 
            // Update minimum cost
            cost += min(zeroes * b, a);
    }
    // Printing the minimum cost
    cout << cost;
}
 
// Driver Code
int main()
{
    string str = "01101110";
    int A = 5, B = 1;
    convert_to_allzeroes(str, A, B);
    return 0;
}


Java




// Java program to implement
// the above approach
class GFG{
     
// Function to find the minimum cost
// to convert given string to 0s only
public static void convert_to_allzeroes(String str,
                                        int a, int b)
{
     
    // Length of string
    int len = str.length();
   
    // Stores the index of leftmost '1' in str
    int left_1, i = 0;
   
    while (i < len && str.charAt(i) == '0')
        i++;
   
    // Update the index of leftmost '1' in str
    left_1 = i;
   
    // Stores the index of rightmost '1' in str
    int right_1;
    i = len - 1;
     
    while (i >= 0 && str.charAt(i) == '0')
        i--;
   
    // Update the index of rightmost '1' in str
    right_1 = i;
   
    // If str does not contain any '1's
    if (left_1 == len && right_1 == -1)
    {
         
        // No changes required
        System.out.print(0);
        return;
    }
   
    // Stores minimum cost
    int cost = a, zeroes;
   
    // Iterating through str form
    // left_1 to right_1
    for(i = left_1; i <= right_1; i++)
    {
         
        // Stores length of
        // consecutive 0s
        zeroes = 0;
   
        // Calculate length of consecutive 0s
        while (i < len && str.charAt(i) == '0')
        {
            zeroes++;
            i++;
        }
   
        // If a substring of 0s exists
        if (zeroes != 0)
   
            // Update minimum cost
            cost += Math.min(zeroes * b, a);
    }
     
    // Printing the minimum cost
    System.out.print(cost);
}
 
// Driver code
public static void main(String[] args)
{
    String str = "01101110";
    int A = 5, B = 1;
     
    convert_to_allzeroes(str, A, B);
}
}
 
// This code is contributed by divyeshrabadiya07


Python3




# Python3 Program to implement
# the above approach
 
# Function to find the minimum
# cost to convert given string
# to 0s only
def convert_to_allzeroes(st,
                         a, b):
 
    # Length of string
    length = len(st)
 
    # Stores the index of
    # leftmost '1' in str
    left_1 = 0
    i = 0
 
    while (i < length and
           st[i] == '0'):
        i += 1
 
    # Update the index of
    # leftmost '1' in str
    left_1 = i
 
    # Stores the index of
    # rightmost '1' in str
    right_1 = 0
    i = length - 1
     
    while (i >= 0 and
           st[i] == '0'):
        i -= 1
 
    # Update the index of
    # rightmost '1' in str
    right_1 = i
 
    # If str does not contain
    # any '1's
    if (left_1 == length and
        right_1 == -1):
 
        # No changes required
        print(0)
        return
 
    # Stores minimum cost
    cost = a
 
    # Iterating through str form
    # left_1 to right_1
    for i in range(left_1,
                   right_1 + 1):
 
        # Stores length of
        # consecutive 0s
        zeroes = 0
 
        # Calculate length of
        # consecutive 0s
        while (i < length and
               st[i] == '0'):
            zeroes += 1
            i += 1
 
        # If a substring of
        # 0s exists
        if (zeroes):
 
            # Update minimum cost
            cost += min(zeroes * b, a)
 
    # Printing the minimum cost
    print(cost)
 
# Driver Code
if __name__ == "__main__":
 
    st = "01101110"
    A = 5
    B = 1
    convert_to_allzeroes(st, A, B)
 
# This code is contributed by Chitranayal


C#




// C# program to implement
// the above approach 
using System;
 
class GFG{
      
// Function to find the minimum cost
// to convert given string to 0s only
public static void convert_to_allzeroes(string str,
                                        int a, int b)
{
     
    // Length of string
    int len = str.Length;
    
    // Stores the index of leftmost '1' in str
    int left_1, i = 0;
    
    while (i < len && str[i] == '0')
        i++;
    
    // Update the index of leftmost '1' in str
    left_1 = i;
    
    // Stores the index of rightmost '1' in str
    int right_1;
    i = len - 1;
      
    while (i >= 0 && str[i] == '0')
        i--;
    
    // Update the index of rightmost '1' in str
    right_1 = i;
    
    // If str does not contain any '1's
    if (left_1 == len && right_1 == -1)
    {
         
        // No changes required
        Console.Write(0);
        return;
    }
    
    // Stores minimum cost
    int cost = a, zeroes;
    
    // Iterating through str form
    // left_1 to right_1
    for(i = left_1; i <= right_1; i++)
    {
         
        // Stores length of
        // consecutive 0s
        zeroes = 0;
    
        // Calculate length of consecutive 0s
        while (i < len && str[i] == '0')
        {
            zeroes++;
            i++;
        }
    
        // If a substring of 0s exists
        if (zeroes != 0)
         
            // Update minimum cost
            cost += Math.Min(zeroes * b, a);
    }
      
    // Printing the minimum cost
    Console.Write(cost);
}
  
// Driver code
public static void Main()
{
    string str = "01101110";
    int A = 5, B = 1;
     
    convert_to_allzeroes(str, A, B);
}
}
 
// This code is contributed by susmitakundugoaldanga


Javascript




<script>
 
// JavaScript program for the above approach
 
// Function to find the minimum cost
// to convert given string to 0s only
function convert_to_allzeroes(str, a, b)
{
      
    // Length of string
    let len = str.length;
     
    // Stores the index of leftmost '1' in str
    let left_1, i = 0;
     
    while (i < len && str[i] == '0')
        i++;
     
    // Update the index of leftmost '1' in str
    left_1 = i;
     
    // Stores the index of rightmost '1' in str
    let right_1;
    i = len - 1;
       
    while (i >= 0 && str[i] == '0')
        i--;
     
    // Update the index of rightmost '1' in str
    right_1 = i;
     
    // If str does not contain any '1's
    if (left_1 == len && right_1 == -1)
    {
          
        // No changes required
        document.write(0);
        return;
    }
     
    // Stores minimum cost
    let cost = a, zeroes;
     
    // Iterating through str form
    // left_1 to right_1
    for(i = left_1; i <= right_1; i++)
    {
          
        // Stores length of
        // consecutive 0s
        zeroes = 0;
     
        // Calculate length of consecutive 0s
        while (i < len && str[i] == '0')
        {
            zeroes++;
            i++;
        }
     
        // If a substring of 0s exists
        if (zeroes != 0)
          
            // Update minimum cost
            cost += Math.min(zeroes * b, a);
    }
       
    // Printing the minimum cost
    document.write(cost);
}
 
// Driver Code
 
    let str = "01101110";
    let A = 5, B = 1;
      
    convert_to_allzeroes(str, A, B);
 
</script>


Output: 

6

 

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

 



Last Updated : 24 Nov, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads