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++ 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 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 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# 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 |
<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> |
6
Time Complexity: O(N), where N is the length of the string.
Auxiliary Space: O(1)