Make given Binary Strings equal by replacing two consecutive 0s with single 1 repeatedly
Given two binary strings str1 and str2, the task is to check whether it is possible to convert str1 to str2 by combining two consecutive 0’s into a single 1 repeatedly.
Examples:
Input: str1 = “00100”, str2 = “111”
Output: Yes
Explanation: Combine first two zeros to one and combine last two zeros to one.Input: str1 = “00”, str2 = “000”
Output: No
Explanation: It is not possible to convert str1 to str2.
Approach: Let’s process str1 and str2 character by character from left to right in parallel. Let’s use two indices i and j: the index i is for str1 and the index j is for str2. Now, there are two cases:
- If str1[i] = str2[j] then increment both i and j.
- If str1[i] != str2[j] then,
- If there are two consecutive 0’s in str1 i.e. str1[i] = 0 and str1[i + 1] = 0 and str2[j] = 1 which means both the zeroes can be combined to match with the 1 in str2. So, increment i by 2 and j by 1.
- Else str1 cannot be converted to str2.
- If in the end both i and j are at the end of their respective strings i.e. str1 and str2 then the answer is Yes else the answer is No.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function that returns true if str1 can be // converted to str2 with the given operations bool canConvert(string str1, string str2) { int i = 0, j = 0; // Traverse from left to right while (i < str1.size() && j < str2.size()) { // If the two characters do not match if (str1[i] != str2[j]) { // If possible to combine if (str1[i] == '0' && str2[j] == '1' && i + 1 < str1.size() && str1[i + 1] == '0') { i += 2; j++; } // If not possible to combine else { return false; } } // If the two characters match else { i++; j++; } } // If possible to convert one string to another if (i == str1.size() && j == str2.size()) return true; return false; } // Driver code int main() { string str1 = "00100", str2 = "111"; if (canConvert(str1, str2)) cout << "Yes"; else cout << "No"; return 0; }
Java
// Java implementation of the approach class GFG { // Function that returns true if str1 can be // converted to str2 with the given operations static boolean canConvert(String str1, String str2) { int i = 0, j = 0; // Traverse from left to right while (i < str1.length() && j < str2.length()) { // If the two characters do not match if (str1.charAt(i) != str2.charAt(j)) { // If possible to combine if (str1.charAt(i) == '0' && str2.charAt(j) == '1' && i + 1 < str1.length() && str1.charAt(i + 1) == '0') { i += 2; j++; } // If not possible to combine else { return false; } } // If the two characters match else { i++; j++; } } // If possible to convert one string to another if (i == str1.length() && j == str2.length()) return true; return false; } // Driver code public static void main(String[] args) { String str1 = "00100", str2 = "111"; if (canConvert(str1, str2)) System.out.println("Yes"); else System.out.println("No"); } } // This code contributed by Rajput-Ji
Python3
# Python implementation of the approach # Function that returns true if str1 can be # converted to str2 with the given operations def canConvert(str1, str2): i, j = 0, 0 # Traverse from left to right while (i < len(str1) and j < len(str2)): # If the two characters do not match if (str1[i] != str2[j]): # If possible to combine if (str1[i] == '0' and str2[j] == '1' and i + 1 < len(str1) and str1[i + 1] == '0'): i += 2 j += 1 # If not possible to combine else: return False # If the two characters match else: i += 1 j += 1 # If possible to convert one string to another if (i == len(str1) and j == len(str2)): return True return False # Driver code str1 = "00100" str2 = "111" if (canConvert(str1, str2)): print("Yes") else: print("No") # This code is contributed by 29AjayKumar
C#
// C# implementation of the approach using System; class GFG { // Function that returns true if str1 can be // converted to str2 with the given operations static bool canConvert(string str1, string str2) { int i = 0, j = 0; // Traverse from left to right while (i < str1.Length && j < str2.Length) { // If the two characters do not match if (str1[i] != str2[j]) { // If possible to combine if (str1[i] == '0' && str2[j] == '1' && i + 1 < str1.Length && str1[i + 1] == '0') { i += 2; j++; } // If not possible to combine else { return false; } } // If the two characters match else { i++; j++; } } // If possible to convert one string to another if (i == str1.Length && j == str2.Length) return true; return false; } // Driver code public static void Main() { string str1 = "00100", str2 = "111"; if (canConvert(str1, str2)) Console.WriteLine("Yes"); else Console.WriteLine("No"); } } // This code is contributed by AnkitRai01
Javascript
<script> // JavaScript implementation of the approach // Function that returns true if str1 can be // converted to str2 with the given operations function canConvert(str1, str2) { var i = 0, j = 0; // Traverse from left to right while (i < str1.length && j < str2.length) { // If the two characters do not match if (str1[i] !== str2[j]) { // If possible to combine if ( str1[i] === "0" && str2[j] === "1" && i + 1 < str1.length && str1[i + 1] === "0" ) { i += 2; j++; } // If not possible to combine else { return false; } } // If the two characters match else { i++; j++; } } // If possible to convert one string to another if (i === str1.length && j === str2.length) return true; return false; } // Driver code var str1 = "00100", str2 = "111"; if (canConvert(str1, str2)) document.write("Yes"); else document.write("No"); </script>
Yes
Time Complexity: O(max(n1, n2)), where n1 and n2 are the lengths of the two strings respectively.
Auxiliary Space: O(1)
Please Login to comment...