给定一个由 0 和 1 组成的二进制字符串。任务是找到给定二进制字符串的任何子字符串中 0 的数量和 1 的数量之间的最大差异。对于给定二进制字符串中的任何子字符串,这是最大化(0 的数量 – 1 的数量)。
例子:
Input : S = "11000010001"
Output : 6
From index 2 to index 9, there are 7
0s and 1 1s, so number of 0s - number
of 1s is 6.
Input : S = "1111"
Output : -1
我们在下面的帖子中讨论了动态规划方法:
二进制字符串中0和1的最大差值|设置 1。
在这篇文章中,我们看到了一种在 O(n) 时间和 O(1) 额外空间中工作的有效方法。背后的想法是,如果我们将所有零转换为 1,将所有 1 转换为 -1。现在我们的问题减少到使用 Kadane 算法找出最大和 sub_array。
Input : S = "11000010001"
After converting '0' into 1 and
'1' into -1 our S Look Like
S = -1 -1 1 1 1 1 -1 1 1 1 -1
Now we have to find out Maximum Sum sub_array
that is : 6 is that case
Output : 6
下面是上述想法的实现。
C++
// CPP Program to find the length of
// substring with maximum difference of
// zeros and ones in binary string.
#include
using namespace std;
// Returns the length of substring with
// maximum difference of zeroes and ones
// in binary string
int findLength(string str, int n)
{
int current_sum = 0;
int max_sum = 0;
// traverse a binary string from left
// to right
for (int i = 0; i < n; i++) {
// add current value to the current_sum
// according to the Character
// if it's '0' add 1 else -1
current_sum += (str[i] == '0' ? 1 : -1);
if (current_sum < 0)
current_sum = 0;
// update maximum sum
max_sum = max(current_sum, max_sum);
}
// return -1 if string does not contain
// any zero that means all ones
// otherwise max_sum
return max_sum == 0 ? -1 : max_sum;
}
// Driven Program
int main()
{
string s = "11000010001";
int n = 11;
cout << findLength(s, n) << endl;
return 0;
}
Java
// Java Program to find the length of
// substring with maximum difference of
// zeroes and ones in binary string.
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG {
// Find the length of substring with maximum
// difference of zeros and ones in binary
// string
public static int findLength(String str, int n)
{
int current_sum = 0;
int max_sum = 0;
// traverse a binary string from left to right
for (int i = 0; i < n; i++) {
// add current value to the current_sum
// according to the Character
// if it's '0' add 1 else -1
current_sum += (str.charAt(i) == '0' ? 1 : -1);
if (current_sum < 0)
current_sum = 0;
// update maximum sum
max_sum = Math.max(current_sum, max_sum);
}
// return -1 if string does not contain any zero
// that means string contains all ones otherwise max_sum
return max_sum == 0 ? -1 : max_sum;
}
public static void main(String[] args)
{
String str = "11000010001";
int n = str.length();
System.out.println(findLength(str, n));
}
}
Python3
# Python Program to find the length of
# substring with maximum difference of
# zeros and ones in binary string.
# Returns the length of substring with
# maximum difference of zeroes and ones
# in binary string
def findLength(string, n):
current_sum = 0
max_sum = 0
# traverse a binary string from left
# to right
for i in range(n):
# add current value to the current_sum
# according to the Character
# if it's '0' add 1 else -1
current_sum += (1 if string[i] == '0' else -1)
if current_sum < 0:
current_sum = 0
# update maximum sum
max_sum = max(current_sum, max_sum)
# return -1 if string does not contain
# any zero that means all ones
# otherwise max_sum
return max_sum if max_sum else 0
# Driven Program
s = "11000010001"
n = 11
print(findLength(s, n))
# This code is contributed by Ansu Kumari.
C#
// C# Program to find the length of
// substring with maximum difference of
// zeroes and ones in binary string.
using System;
class GFG
{
// Find the length of substring with
// maximum difference of zeros and
// ones in binary string
public static int findLength(string str,
int n)
{
int current_sum = 0;
int max_sum = 0;
// traverse a binary string
// from left to right
for (int i = 0; i < n; i++)
{
// add current value to the current_sum
// according to the Character
// if it's '0' add 1 else -1
current_sum += (str[i] == '0' ? 1 : -1);
if (current_sum < 0)
{
current_sum = 0;
}
// update maximum sum
max_sum = Math.Max(current_sum, max_sum);
}
// return -1 if string does not contain
// any zero that means string contains
// all ones otherwise max_sum
return max_sum == 0 ? -1 : max_sum;
}
// Driver Code
public static void Main(string[] args)
{
string str = "11000010001";
int n = str.Length;
Console.WriteLine(findLength(str, n));
}
}
// This code is contributed by Shrikant13
PHP
Javascript
输出:
6
时间复杂度: O(n)
空间复杂度: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。