Check if two Binary Strings can be made equal by doing bitwise XOR of adjacent
Last Updated :
26 Aug, 2022
Given binary strings S1 and S2 of length N, the task is to check if S2 can be made equal to S1 by performing the following operations on S2:
- The first operation is Si = Si ? Si+1. ( ? is the XOR operation)
- The second operation is Si+1 = Si+1 ? Si.
Examples:
Input: S1 = “00100”, S2 = “00011”
Output: Yes
?Explanation: We can apply the following operations on S2 :
1. Select i = 2, So the conversion is 00011 ? 00111
2. Select i = 3. So the conversion is 00111 ? 00100.
Hence it is possible to make S2 equal to S1 by applying the above operation on index 2 and 3.
Input: S1 = “10101”, S2 = “01000”
?Output: No
Approach: The problem can be solved based on the following observation:
The operations have the following effects:
- 01 becomes 11
- 10 becomes 11
- 00 becomes 00
- 11 becomes 00
Let’s get the easy cases out of the way:
- If S2 = S1, the answer is YES
- If S2 is 000…00 (i.e S2 does not have a 1), then we can only perform the operation and it will be the third case shown above, which does not change anything. Therefore, the answer is NO if S2 ? S1.
- Now, assume S2 ? S1 and S2 has a 1. It is possible to convert S2 to S1 if and only if S1 has at least two consecutive same characters.
Follow the steps mentioned below to implement the above idea:
- Check if the strings are already equal to each other. If so, then return true.
- Otherwise, check if S2 has at least one ‘1’:
- If it has, then check for the condition that S1 has at least two consecutive same characters.
- If the above condition is satisfied then return true.
- Otherwise, return false.
Below is the implementation of the above approach.
C++
#include <iostream>
using namespace std;
void checkEqual(string S1, string S2, int n)
{
int c_1 = 0;
int c_2 = 0;
if (S2==S1) {
cout << "Yes" ;
}
for ( int j = 0; j < n; j++) {
if (S2[j] == '1' ) {
c_1++;
}
if (S1[j] == '1' ) {
c_2++;
}
}
if (c_1 == 0 && c_2 > 0) {
cout << "No" ;
}
int c = 0;
for ( int k = 0; k < n - 1; k++) {
if (S1[k] != S1[k + 1]) {
c++;
}
}
if (c == n - 1) {
cout << "No" ;
}
else {
cout << "Yes" ;
}
}
int main()
{
string S1 = "00100" ;
string S2 = "00011" ;
int N = S1.length();
checkEqual(S1, S2, N);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
public static void checkEqual(String S1,
String S2, int n)
{
char [] a = S2.toCharArray();
char [] b = S1.toCharArray();
int c_1 = 0 ;
int c_2 = 0 ;
if (String.valueOf(a).equals(String.valueOf(b))) {
System.out.println( "Yes" );
}
for ( int j = 0 ; j < n; j++) {
if (a[j] == '1' ) {
c_1++;
}
if (b[j] == '1' ) {
c_2++;
}
}
if (c_1 == 0 && c_2 > 0 ) {
System.out.println( "No" );
}
int c = 0 ;
for ( int k = 0 ; k < n - 1 ; k++) {
if (b[k] != b[k + 1 ]) {
c++;
}
}
if (c == n - 1 ) {
System.out.println( "No" );
}
else {
System.out.println( "Yes" );
}
}
public static void main(String[] args)
{
String S1 = "00100" ;
String S2 = "00011" ;
int N = S1.length();
checkEqual(S1, S2, N);
}
}
|
Python3
def checkEqual(S1, S2, n):
c_1 = 0
c_2 = 0
if (S2 = = S1):
print ( "yes" )
for j in range (n):
if (S2[j] = = '1' ):
c_1 + = 1
if (S1[j] = = '1' ):
c_2 + = 1
if (c_1 = = 0 and c_2 > 0 ):
print ( "No" )
c = 0
for k in range (n - 1 ):
if (S1[k] ! = S1[k + 1 ]):
c + = 1
if (c = = n - 1 ):
print ( "No" )
else :
print ( "yes" )
S1 = "00100"
S2 = "00011"
N = len (S1)
checkEqual(S1, S2, N);
|
C#
using System;
public class GFG {
public static void checkEqual(String S1,
String S2, int n)
{
char [] a = S2.ToCharArray();
char [] b = S1.ToCharArray();
int c_1 = 0;
int c_2 = 0;
if (String.Join( "" ,a).Equals(String.Join( "" ,b))) {
Console.WriteLine( "Yes" );
}
for ( int j = 0; j < n; j++) {
if (a[j] == '1' ) {
c_1++;
}
if (b[j] == '1' ) {
c_2++;
}
}
if (c_1 == 0 && c_2 > 0) {
Console.WriteLine( "No" );
}
int c = 0;
for ( int k = 0; k < n - 1; k++) {
if (b[k] != b[k + 1]) {
c++;
}
}
if (c == n - 1) {
Console.WriteLine( "No" );
}
else {
Console.WriteLine( "Yes" );
}
}
public static void Main(String[] args)
{
String S1 = "00100" ;
String S2 = "00011" ;
int N = S1.Length;
checkEqual(S1, S2, N);
}
}
|
Javascript
<script>
function checkEqual(S1, S2, n)
{
let a = S2.split();
let b = S1.split();
let c_1 = 0;
let c_2 = 0;
if (a == b) {
document.write( "Yes" );
}
for (let j = 0; j < n; j++) {
if (a[j] == '1' ) {
c_1++;
}
if (b[j] == '1' ) {
c_2++;
}
}
if (c_1 == 0 && c_2 > 0) {
document.write( "No" );
}
let c = 0;
for (let k = 0; k < n - 1; k++) {
if (b[k] != b[k + 1]) {
c++;
}
}
if (c == n - 1) {
document.write( "No" );
}
else {
document.write( "Yes" );
}
}
let S1 = "00100" ;
let S2 = "00011" ;
let N = S1.length;
checkEqual(S1, S2, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...