📌  相关文章
📜  通过交换出现在0之前的1来检查两个二进制字符串可以相等

📅  最后修改于: 2021-04-21 23:06:53             🧑  作者: Mango

给定两个二进制字符串str1str2的具有相同的长度,任务是寻找是否有可能使两个二进制字符串str1str2的通过交换发生在指数低于0秒指数的二进制字符串STR1全是1等于。

例子:

方法:想法是计算str1str210的数目,然后进行相应的处理。请按照以下步骤解决问题:

  • 如果str1str21 s和0 s的计数不相等,则无法进行转换。
  • 遍历字符串。
  • 从第一个字符,逐个比较每个字符。对于i处的每个不同字符,执行以下步骤:
    • 检查字符串str1的当前字符是否为‘0’并且curStr1Ones(存储字符串str1的当前计数为1 )是否大于0 。如果发现是真的,则将字符替换为“ 1”,并将curStr1Ones的值减1
    • 检查字符串str1中的字符是“0”curStr1Ones等于0。如果发现为真,则将标志的值加1并中断循环。
    • 检查字符串str1中字符是“1”和字符串STR2的字符是“0”。如果确定为true,则将str1的字符替换为“ 0”,并将curStr1Ones的值增加1
  • 最后,如果标志0 ,则打印“可能”,否则打印“不可能”。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to check if it is possible to make
// two binary strings equal by given operations
void isBinaryStringsEqual(string str1, string str2)
{
 
    // Stores count of 1's and 0's
    // of the string str1
    int str1Zeros = 0, str1Ones = 0;
 
    // Stores count of 1's and 0's
    // of the string str2
    int str2Zeros = 0, str2Ones = 0;
 
    int flag = 0;
 
    // Stores current count of 1's
    // presenty in the string str1
    int curStr1Ones = 0;
 
    // Count the number of 1's and 0's
    // present in the strings str1 and str2
    for (int i = 0; i < str1.length(); i++) {
 
        if (str1[i] == '1') {
            str1Ones++;
        }
 
        else if (str1[i] == '0') {
            str1Zeros++;
        }
 
        if (str2[i] == '1') {
            str2Ones++;
        }
 
        else if (str2[i] == '0') {
            str2Zeros++;
        }
    }
 
    // If the number of 1's and 0's
    // are not same of the strings str1
    // and str2 then print not possible
    if (str1Zeros != str2Zeros && str1Ones != str2Ones) {
        cout << "Not Possible";
    }
 
    else {
 
        // Traversing through the
        // strings str1 and str2
        for (int i = 0; i < str1.length(); i++) {
 
            // If the str1 character not
            // equals to str2 character
            if (str1[i] != str2[i]) {
 
                // Swaps 0 with 1 of the
                // string str1
                if (str1[i] == '0' && curStr1Ones > 0) {
                    str1[i] = '1';
                    curStr1Ones--;
                }
 
                // Breaks the loop as the count
                // of 1's is zero. Hence, no swaps possible
                if (str1[i] == '0' && curStr1Ones == 0) {
 
                    flag++;
                    break;
                }
 
                // Swaps 1 with 0 in the string str1
                if (str1[i] == '1' && str2[i] == '0') {
 
                    str1[i] = '0';
                    curStr1Ones++;
                }
            }
        }
 
        if (flag == 0) {
            cout << "Possible";
        }
 
        // Print not possible
        else {
            cout << "Not Possible";
        }
    }
}
 
// Driver Code
int main()
{
    // Given Strings
    string str1 = "0110";
    string str2 = "0011";
 
    // Function Call
    isBinaryStringsEqual(str1, str2);
 
    return 0;
}


Java
// Java program for the above approach
import java.io.*;
class GFG {
 
  // Function to check if it is possible to make
  // two binary strings equal by given operations
  static void isBinaryStringsEqual(String str1,
                                   String str2)
  {
 
    // Stores count of 1's and 0's
    // of the string str1
    int str1Zeros = 0, str1Ones = 0;
 
    // Stores count of 1's and 0's
    // of the string str2
    int str2Zeros = 0, str2Ones = 0;
    int flag = 0;
 
    // Stores current count of 1's
    // presenty in the string str1
    int curStr1Ones = 0;
 
    // Count the number of 1's and 0's
    // present in the strings str1 and str2
    for (int i = 0; i < str1.length(); i++)
    {
 
      if (str1.charAt(i) == '1')
      {
        str1Ones++;
      }
 
      else if (str1.charAt(i) == '0')
      {
        str1Zeros++;
      }
 
      if (str2.charAt(i) == '1')
      {
        str2Ones++;
      }
 
      else if (str2.charAt(i) == '0')
      {
        str2Zeros++;
      }
    }
 
    // If the number of 1's and 0's
    // are not same of the strings str1
    // and str2 then print not possible
    if (str1Zeros != str2Zeros
        && str1Ones != str2Ones)
    {
      System.out.println("Not Possible");
    }
 
    else {
 
      // Traversing through the
      // strings str1 and str2
      for (int i = 0; i < str1.length(); i++)
      {
 
        // If the str1 character not
        // equals to str2 character
        if (str1.charAt(i) != str2.charAt(i))
        {
 
          // Swaps 0 with 1 of the
          // string str1
          if (str1.charAt(i) == '0'
              && curStr1Ones > 0)
          {
            str1 = str1.substring(0, i) + '1'
              + str1.substring(i + 1);
            curStr1Ones--;
          }
 
          // Breaks the loop as the count
          // of 1's is zero. Hence, no swaps
          // possible
          if (str1.charAt(i) == '0'
              && curStr1Ones == 0)
          {
            flag++;
            break;
          }
 
          // Swaps 1 with 0 in the string str1
          if (str1.charAt(i) == '1'
              && str2.charAt(i) == '0')
          {
            str1 = str1.substring(0, i) + '0'
              + str1.substring(i+1);
            curStr1Ones++;
          }
        }
      }
 
      if (flag == 0) {
        System.out.println("Possible");
      }
 
      // Print not possible
      else {
        System.out.println("Not Possible");
      }
    }
  }
 
  // Driver Code
  public static void main(String[] args)
  {
 
    // Given Strings
    String str1 = "0110";
    String str2 = "0011";
 
    // Function Call
    isBinaryStringsEqual(str1, str2);
  }
}
 
// This code is contributed by dharanendralv23


Python3
# Python program for the above approach
 
# Function to check if it is possible to make
# two binary strings equal by given operations
def isBinaryStringsEqual(list1, list2) :
     
    str1 = list(list1)
    str2 = list(list2)
 
    # Stores count of 1's and 0's
    # of the string str1
    str1Zeros = 0
    str1Ones = 0
 
    # Stores count of 1's and 0's
    # of the string str2
    str2Zeros = 0
    str2Ones = 0
    flag = 0
 
    # Stores current count of 1's
    # presenty in the string str1
    curStr1Ones = 0
 
    # Count the number of 1's and 0's
    # present in the strings str1 and str2
    for i in range(len(str1)):
        if (str1[i] == '1') :
            str1Ones += 1
        elif (str1[i] == '0') :
            str1Zeros += 1
        if (str2[i] == '1') :
            str2Ones += 1
        elif (str2[i] == '0') :
            str2Zeros += 1
        
    # If the number of 1's and 0's
    # are not same of the strings str1
    # and str2 then prnot possible
    if (str1Zeros != str2Zeros and str1Ones != str2Ones) :
        print("Not Possible")
    else :
 
        # Traversing through the
        # strings str1 and str2
        for i in range(len(str1)):
 
            # If the str1 character not
            # equals to str2 character
            if (str1[i] != str2[i]) :
 
                # Swaps 0 with 1 of the
                # string str1
                if (str1[i] == '0' and curStr1Ones > 0) :              
                    str1[i] = '1'
                    curStr1Ones -= 1
                 
                # Breaks the loop as the count
                # of 1's is zero. Hence, no swaps possible
                if (str1[i] == '0' and curStr1Ones == 0) :
                    flag += 1
                    break
                 
                # Swaps 1 with 0 in the string str1
                if (str1[i] == '1' and str2[i] == '0') :
                    str1[i] = '0'
                    curStr1Ones += 1
                 
        if (flag == 0) :
            print("Possible")
         
        # Prnot possible
        else :
           print("Not Possible")
 
# Driver Code
 
# Given Strings
str1 = "0110"
str2 = "0011"
 
# Function Call
isBinaryStringsEqual(str1, str2)
 
# This code is contributed by mohit kumar 29.


C#
// C# program for the above approach
using System;
using System.Text;
class GFG
{
 
  // Function to check if it is possible to make
  // two binary strings equal by given operations
  static void isBinaryStringsEqual(string str1,
                                   string str2)
  {
 
    // Stores count of 1's and 0's
    // of the string str1
    int str1Zeros = 0, str1Ones = 0;
 
    // Stores count of 1's and 0's
    // of the string str2
    int str2Zeros = 0, str2Ones = 0;
    int flag = 0;
 
    // Stores current count of 1's
    // presenty in the string str1
    int curStr1Ones = 0;
 
    // Count the number of 1's and 0's
    // present in the strings str1 and str2
    for (int i = 0; i < str1.Length; i++)
    {
      if (str1[i] == '1')
      {
        str1Ones++;
      }
 
      else if (str1[i] == '0')
      {
        str1Zeros++;
      }
 
      if (str2[i] == '1')
      {
        str2Ones++;
      }
 
      else if (str2[i] == '0')
      {
        str2Zeros++;
      }
    }
 
    // If the number of 1's and 0's
    // are not same of the strings str1
    // and str2 then print not possible
    if (str1Zeros != str2Zeros
        && str1Ones != str2Ones)
    {
      Console.WriteLine("Not Possible");
    }
 
    else
    {
 
      // Traversing through the
      // strings str1 and str2
      for (int i = 0; i < str1.Length; i++)
      {
 
        // If the str1 character not
        // equals to str2 character
        if (str1[i] != str2[i])
        {
 
          // Swaps 0 with 1 of the
          // string str1
          if (str1[i] == '0' && curStr1Ones > 0)
          {
            StringBuilder sb
              = new StringBuilder(str1);
            sb[i] = '1';
            str1 = sb.ToString();
            curStr1Ones--;
          }
 
          // Breaks the loop as the count
          // of 1's is zero. Hence, no swaps
          // possible
          if (str1[i] == '0'
              && curStr1Ones == 0)
          {
            flag++;
            break;
          }
 
          // Swaps 1 with 0 in the string str1
          if (str1[i] == '1' && str2[i] == '0')
          {
            StringBuilder sb
              = new StringBuilder(str1);
            sb[i] = '0';
            str1 = sb.ToString();
            curStr1Ones++;
          }
        }
      }
 
      if (flag == 0)
      {
        Console.WriteLine("Possible");
      }
 
      // Print not possible
      else
      {
        Console.WriteLine("Not Possible");
      }
    }
  }
 
  // Driver Code
  static public void Main()
  {
 
    // Given Strings
    string str1 = "0110";
    string str2 = "0011";
 
    // Function Call
    isBinaryStringsEqual(str1, str2);
  }
}
 
// This code is contributed by dharanendralv23


输出
Possible

时间复杂度: O(| str1 |)
辅助空间: O(1)