Generate string with Hamming Distance as half of the hamming distance between strings A and B

02 Mar, 2022
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.
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++
Java
Python3
C#
Javascript
// C++ implementation of the above// approach#include <bits/stdc++.h>using namespace std; // Function to find the required// stringvoid 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 Codeint main(){    string A = "1001010";    string B = "0101010";     // Function to find the resultant    // string    findString(A, B);    return 0;}
// Java implementation of the above// approachclass 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# stringdef 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 Codeif __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 approachusing 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// stringfunction 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 Codelet A = "1001010";let B = "0101010"; // Function to find the resultant// stringfindString(A, B);     // This code is contributed by shinjanpatra </script>
0001010
 
Time Complexity: O(N), where N is the length of the string. 
Yash_R
shinjanpatra
binary-string
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.