给定两个二进制字符串str1和str2的具有相同的长度,任务是寻找是否有可能使两个二进制字符串str1和str2的通过交换发生在指数低于0秒指数的二进制字符串STR1全是1等于。
例子:
Input: str1 = “0110”, str2 = “0011”
Output: Possible
Explanation:
Swapping str1[2] with str1[3] the binary string str1 becomes “0101”.
Swapping str1[1] with str1[2] the binary string str1 becomes “0011” .
The binary string str1 becomes equal to the binary string str2 therefore, the required output is Possible.
Input: str1 = “101”, str2 = “010”
Output: Not Possible
方法:想法是计算str1和str2中1和0的数目,然后进行相应的处理。请按照以下步骤解决问题:
- 如果str1和str2中1 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)