Minimum substring flips required to convert a Binary String to another
Last Updated :
01 Jun, 2021
Given two binary strings S1 and S2 of size N and M respectively, the task is to find the minimum number of reversal of substrings of equal characters required to convert the string S1 to S2. If it is not possible to convert the string S1 to S2, then print "-1".
Examples:
Input: S1 = "100001", S2 = "110111"
Output: 2
Explanation:
Initially string S1 = "100001".
Reversal 1: Reverse the substring S1[1, 1], then the string S1 becomes "110001".
Reversal 2: Reverse the substring S1[3, 4], then the string S1 becomes "110111".
After the above reversals, the string S1 and S2 are equal.
Therefore, the count of reversals is 2.
Input: S1 = 101, S2 = 10
Output: -1
Approach: Follow the below steps to solve this problem:
- Initialize a variable, say answer, to store the resultant count of reversal required.
- If the length of the given strings S1 and S2 are not the same, then print "-1".
- Iterate over the range [0, N - 1] and perform the following steps:
- If S1[i] and S2[i] are not the same, then iterate till S1[i] and S2[i] are the same. Increment the answer by 1 as the current substring needs to be flipped.
- Otherwise, continue to the next iteration.
- After completing the above steps, print the value of the answer as the resultant flipping of substrings required.
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to count the minimum number
// of reversals required to make the
// given binary strings s1 and s2 same
int canMakeSame(string s1, string s2)
{
// Stores the minimum count of
// reversal of substrings required
int ans = 0;
// If the length of the strings
// are not the same then return -1
if (s1.size() != s2.size()) {
return -1;
}
int N = s1.length();
// Iterate over each character
for (int i = 0; i < N; i++) {
// If s1[i] is not
// equal to s2[i]
if (s1[i] != s2[i]) {
// Iterate until s1[i] != s2[i]
while (i < s1.length()
&& s1[i] != s2[i]) {
i++;
}
// Increment answer by 1
ans++;
}
}
// Return the resultant count of
// reversal of substring required
return ans;
}
// Driver Code
int main()
{
string S1 = "100001";
string S2 = "110111";
// Function Call
cout << canMakeSame(S1, S2);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG
{
// Function to count the minimum number
// of reversals required to make the
// given binary strings s1 and s2 same
static int canMakeSame(String s1, String s2)
{
// Stores the minimum count of
// reversal of substrings required
int ans = 0;
// If the length of the strings
// are not the same then return -1
if (s1.length() != s2.length()) {
return -1;
}
int N = s1.length();
// Iterate over each character
for (int i = 0; i < N; i++)
{
// If s1[i] is not
// equal to s2[i]
if (s1.charAt(i) != s2.charAt(i))
{
// Iterate until s1[i] != s2[i]
while (i < s1.length()
&& s1.charAt(i) != s2.charAt(i))
{
i++;
}
// Increment answer by 1
ans++;
}
}
// Return the resultant count of
// reversal of substring required
return ans;
}
// Driver Code
public static void main(String[] args)
{
String S1 = "100001";
String S2 = "110111";
// Function Call
System.out.println(canMakeSame(S1, S2));
}
}
// This code is contributed by Dharanendra L V
Python3
# Python3 program for the above approach
# Function to count the minimum number
# of reversals required to make the
# given binary strings s1 and s2 same
def canMakeSame(s1, s2) :
# Stores the minimum count of
# reversal of substrings required
ans = -1
# If the length of the strings
# are not the same then return -1
if (len(s1) != len(s2)) :
return -1
N = len(s1)
# Iterate over each character
for i in range(0, N):
# If s1[i] is not
# equal to s2[i]
if (s1[i] != s2[i]) :
# Iterate until s1[i] != s2[i]
while (i < len(s1)
and s1[i] != s2[i]) :
i += 1
# Increment answer by 1
ans += 1
# Return the resultant count of
# reversal of subrequired
return ans
# Driver Code
S1 = "100001"
S2 = "110111"
# Function Call
print(canMakeSame(S1, S2))
# This code is contributed by code_hunt.
C#
// C# program for the above approach
using System;
class GFG{
// Function to count the minimum number
// of reversals required to make the
// given binary strings s1 and s2 same
static int canMakeSame(string s1, string s2)
{
// Stores the minimum count of
// reversal of substrings required
int ans = 0;
// If the length of the strings
// are not the same then return -1
if (s1.Length != s2.Length) {
return -1;
}
int N = s1.Length;
// Iterate over each character
for (int i = 0; i < N; i++)
{
// If s1[i] is not
// equal to s2[i]
if (s1[i] != s2[i])
{
// Iterate until s1[i] != s2[i]
while (i < s1.Length
&& s1[i] != s2[i])
{
i++;
}
// Increment answer by 1
ans++;
}
}
// Return the resultant count of
// reversal of substring required
return ans;
}
// Driver Code
public static void Main(string[] args)
{
string S1 = "100001";
string S2 = "110111";
// Function Call
Console.Write(canMakeSame(S1, S2));
}
}
// This code is contributed by susmitakundugoaldanga.
JavaScript
<script>
// JavaScript program for the above approach
// Function to count the minimum number
// of reversals required to make the
// given binary strings s1 and s2 same
function canMakeSame(s1, s2)
{
// Stores the minimum count of
// reversal of substrings required
var ans = 0;
// If the length of the strings
// are not the same then return -1
if (s1.length != s2.length) {
return -1;
}
var N = s1.length;
// Iterate over each character
for (var i = 0; i < N; i++) {
// If s1[i] is not
// equal to s2[i]
if (s1[i] != s2[i]) {
// Iterate until s1[i] != s2[i]
while (i < s1.length
&& s1[i] != s2[i]) {
i++;
}
// Increment answer by 1
ans++;
}
}
// Return the resultant count of
// reversal of substring required
return ans;
}
// Driver Code
var S1 = "100001";
var S2 = "110111";
// Function Call
document.write( canMakeSame(S1, S2));
</script>
Time Complexity: O(N)
Auxiliary Space: O(1)
Similar Reads
Minimum substring flips required to convert given binary string to another Given two binary strings A and B, the task is to find the minimum number of times a substring starting from the first character of A needs to be flipped, i.e. convert 1s to 0s and 0s to 1s, to convert A to B. Examples: Input: A = â0010â, B = â1011âOutput; 3Explanation:Step 1: Flip the entire string
7 min read
Minimum prefixes required to be flipped to convert a Binary String to another Given two binary strings A and B of length N, the task is to convert the string from A to string B by repeatedly flipping all the bits of a prefix of A, i.e. convert all the 0s in the prefix to 1s and vice-versa and print the minimum number of prefix flips required and the length of respective prefi
9 min read
Minimum swaps required to convert one binary string to another Given two binary string M and N of equal length, the task is to find a minimum number of operations (swaps) required to convert string N to M. Examples: Input: str1 = "1101", str2 = "1110" Output: 1 Swap last and second last element in the binary string, so that it become 1101 Input: str1 = "1110000
5 min read
Minimum flips required in a binary string such that all K-size substring contains 1 Given a binary string str of size N and a positive integer K, the task is to find the minimum number of flips required to make all substring of size K contain at least one '1'.Examples: Input: str = "0001", K = 2 Output: 1 Explanation: Flipping the bit at index 1 modifies str to "0101". All substrin
11 min read
Minimum number of given operations required to convert a string to another string Given two strings S and T of equal length. Both strings contain only the characters '0' and '1'. The task is to find the minimum number of operations to convert string S to T. There are 2 types of operations allowed on string S: Swap any two characters of the string.Replace a '0' with a '1' or vice
14 min read