Given two Binary string A and B of length N, the task is to find the Binary string whose Hamming Distance to strings A and B is half the Hamming Distance of A and B.
Examples:
Input: A = “1001010”, B = “0101010”
Output: 0001010
Explanation:
The hamming distance of the string A and B is 2.
The hamming distance of the output string to A is 1.
The hamming distance of the output string to B is 1.
Input: A = “1001010”, B = “1101010”
Output: Not Possible
Explanation:
There exist no string which satisfy our condition.
Naive Approach: A naive approach is to generate all possible binary strings of the length N and the calculate the Hamming Distance of each string with A and B. If the Hamming Distance between the generated string and to the given string A and B is half the Hamming Distance between A and B, then the generated string is the resultant string. Else there is no such string exist.
Time Complexity: O(2N)
Efficient Approach:
- Find the Hamming Distance(say a) between the two given string A and B. If a is odd then we can’t generate another string with Hamming Distance (a/2) with the strings A and B.
- If a is even, then choose first (a/2) characters from string A which is not equal to string B and next (a/2) characters from string B which does not equal to string A to make the resulting string.
- Append the equal characters from string A and B to the resultant string.
Below is the implementation of the above approach:
// C++ implementation of the above // approach #include <bits/stdc++.h> using namespace std;
// Function to find the required // string void findString(string A, string B)
{ int dist = 0;
// Find the hamming distance
// between A and B
for ( int i = 0; A[i]; i++) {
if (A[i] != B[i]) {
dist++;
}
}
// If distance is odd, then
// resultant string is not
// possible
if (dist & 1) {
cout << "Not Possible"
<< endl;
}
// Make the resultant string
else {
// To store the final
// string
string res = "" ;
int K = dist / 2;
// Pick k characters from
// each string
for ( int i = 0; A[i]; i++) {
// Pick K characters
// from string B
if (A[i] != B[i] && K > 0) {
res.push_back(B[i]);
K--;
}
// Pick K characters
// from string A
else if (A[i] != B[i]) {
res.push_back(A[i]);
}
// Append the res characters
// from string to the
// resultant string
else {
res.push_back(A[i]);
}
}
// Print the resultant
// string
cout << res << endl;
}
} // Driver's Code int main()
{ string A = "1001010" ;
string B = "0101010" ;
// Function to find the resultant
// string
findString(A, B);
return 0;
} |
// Java implementation of the above // approach class GFG
{ // Function to find the required
// string
static void findString(String A, String B)
{
int dist = 0 ;
// Find the hamming distance
// between A and B
for ( int i = 0 ; i < A.length(); i++)
{
if (A.charAt(i) != B.charAt(i))
dist++;
}
// If distance is odd, then
// resultant string is not
// possible
if ((dist & 1 ) == 1 )
{
System.out.println( "Not Possible" );
}
// Make the resultant string
else
{
// To store the final
// string
String res = "" ;
int K = ( int )dist / 2 ;
// Pick k characters from
// each string
for ( int i = 0 ; i < A.length(); i++) {
// Pick K characters
// from string B
if (A.charAt(i) != B.charAt(i) && K > 0 ) {
res += B.charAt(i);
K--;
}
// Pick K characters
// from string A
else if (A.charAt(i) != B.charAt(i)) {
res += A.charAt(i);
}
// Append the res characters
// from string to the
// resultant string
else {
res += A.charAt(i);
}
}
// Print the resultant
// string
System.out.println(res) ;
}
}
// Driver's Code
public static void main (String[] args)
{
String A = "1001010" ;
String B = "0101010" ;
// Function to find the resultant
// string
findString(A, B);
}
} // This code is contributed by Yash_R |
# Python3 implementation of the above # approach # Function to find the required # string def findString(A, B) :
dist = 0 ;
# Find the hamming distance
# between A and B
for i in range ( len (A)) :
if (A[i] ! = B[i]) :
dist + = 1 ;
# If distance is odd, then
# resultant string is not
# possible
if (dist & 1 ) :
print ( "Not Possible" );
# Make the resultant string
else :
# To store the final
# string
res = "";
K = dist / / 2 ;
# Pick k characters from
# each string
for i in range ( len (A)) :
# Pick K characters
# from string B
if (A[i] ! = B[i] and K > 0 ) :
res + = B[i];
K - = 1 ;
# Pick K characters
# from string A
elif (A[i] ! = B[i]) :
res + = A[i];
# Append the res characters
# from string to the
# resultant string
else :
res + = A[i];
# Print the resultant
# string
print (res);
# Driver's Code if __name__ = = "__main__" :
A = "1001010" ;
B = "0101010" ;
# Function to find the resultant
# string
findString(A, B);
# This code is contributed by Yash_R |
// C# implementation of the above approach using System;
class GFG
{ // Function to find the required
// string
static void findString( string A, string B)
{
int dist = 0;
// Find the hamming distance
// between A and B
for ( int i = 0; i < A.Length; i++)
{
if (A[i] != B[i])
dist++;
}
// If distance is odd, then
// resultant string is not
// possible
if ((dist & 1) == 1)
{
Console.WriteLine( "Not Possible" );
}
// Make the resultant string
else
{
// To store the final
// string
string res = "" ;
int K = ( int )dist / 2;
// Pick k characters from
// each string
for ( int i = 0; i < A.Length; i++) {
// Pick K characters
// from string B
if (A[i] != B[i] && K > 0) {
res += B[i];
K--;
}
// Pick K characters
// from string A
else if (A[i] != B[i]) {
res += A[i];
}
// Append the res characters
// from string to the
// resultant string
else {
res += A[i];
}
}
// Print the resultant
// string
Console.WriteLine(res) ;
}
}
// Driver's Code
public static void Main ( string [] args)
{
string A = "1001010" ;
string B = "0101010" ;
// Function to find the resultant
// string
findString(A, B);
}
} // This code is contributed by Yash_R |
<script> // JavaScript implementation of the above // approach // Function to find the required // string function findString(A, B)
{ let dist = 0;
// Find the hamming distance
// between A and B
for (let i = 0; A[i]; i++) {
if (A[i] != B[i]) {
dist++;
}
}
// If distance is odd, then
// resultant string is not
// possible
if (dist & 1) {
document.write( "Not Possible" , "</br>" );
}
// Make the resultant string
else {
// To store the final
// string
let res = "" ;
let K = Math.floor(dist / 2);
// Pick k characters from
// each string
for (let i = 0; A[i]; i++) {
// Pick K characters
// from string B
if (A[i] != B[i] && K > 0) {
res+=(B[i]);
K--;
}
// Pick K characters
// from string A
else if (A[i] != B[i]) {
res+=(A[i]);
}
// Append the res characters
// from string to the
// resultant string
else {
res+=(A[i]);
}
}
// Print the resultant
// string
document.write(res, "</br>" );
}
} // Driver's Code let A = "1001010" ;
let B = "0101010" ;
// Function to find the resultant // string findString(A, B); // This code is contributed by shinjanpatra </script> |
0001010
Time Complexity: O(N), where N is the length of the string.
Auxiliary Space: O(N)