Diferencia máxima de ceros y unos en string binaria – Part 1

Dada una string binaria de 0s y 1s . La tarea es encontrar la longitud de la substring que tiene una diferencia máxima entre el número de 0 y el número de 1 (número de 0 – número de 1 ). En el caso de todos los 1, imprima -1.

Ejemplos: 

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

Ahora, en cada índice i debemos tomar la decisión de tomarlo o saltearlo. Entonces, declare una array 2D de tamaño nx 2 , donde n es la longitud de la string binaria dada, digamos dp[n][2]

dp[i][0] define the maximum value upto 
         index i, when we skip the i-th
         index element.
dp[i][1] define the maximum value upto 
         index i after taking the i-th
         index element.

Therefore, we can derive dp[i][] as:
dp[i][0] = max(dp[i+1][0], dp[i+1][1] + arr[i])
dp[i][1] = max(dp[i+1][1] + arr[i], 0)

Para todos, verificamos este caso explícitamente.

C++

// CPP Program to find the length of
// substring with maximum difference of
// zeroes and ones in binary string.
#include <bits/stdc++.h>
#define MAX 100
using namespace std;
 
// Return true if there all 1s
bool allones(string s, int n)
{
    // Checking each index is 1 or not.
    int co = 0;
    for (int i = 0; i < s.size(); i++)
        co += (s[i] == '1');
 
    return (co == n);
}
 
// Find the length of substring with maximum
// difference of zeroes and ones in binary
// string
int findlength(int arr[], string s, int n, int ind, int st,
               int dp[][3])
{
    // If string is over.
    if (ind >= n)
        return 0;
 
    // If the state is already calculated.
    if (dp[ind][st] != -1)
        return dp[ind][st];
 
    if (st == 0)
        return dp[ind][st]
               = max(arr[ind]
                         + findlength(arr, s, n, ind + 1, 1,
                                      dp),
                     findlength(arr, s, n, ind + 1, 0, dp));
 
    else
        return dp[ind][st]
               = max(arr[ind]
                         + findlength(arr, s, n, ind + 1, 1,
                                      dp),
                     0);
}
 
// Returns length of substring which is
// having maximum difference of number
// of 0s and number of 1s
int maxLen(string s, int n)
{
    // If all 1s return -1.
    if (allones(s, n))
        return -1;
 
    // Else find the length.
    int arr[MAX] = { 0 };
    for (int i = 0; i < n; i++)
        arr[i] = (s[i] == '0' ? 1 : -1);
 
    int dp[MAX][3];
    memset(dp, -1, sizeof dp);
    return findlength(arr, s, n, 0, 0, dp);
}
 
// Driven Program
int main()
{
    string s = "11000010001";
    int n = 11;
    cout << maxLen(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.Arrays;
 
class GFG
{
static final int MAX=100;
 
// Return true if there all 1s
static boolean allones(String s, int n)
{
    // Checking each index is 0 or not.
    int co = 0;
    for (int i = 0; i < s.length(); i++)
        if(s.charAt(i) == '1')
            co +=1;    
 
    return (co == n);
}
 
// Find the length of substring with maximum
// difference of zeroes and ones in binary
// string
static int findlength(int arr[], String s, int n,
                     int ind, int st, int dp[][])
{
    // If string is over.
    if (ind >= n)
        return 0;
 
    // If the state is already calculated.
    if (dp[ind][st] != -1)
        return dp[ind][st];
 
    if (st == 0)
        return dp[ind][st] = Math.max(arr[ind] +
                             findlength(arr, s, n,
                                   ind + 1, 1, dp),
                             findlength(arr, s, n,
                                   ind + 1, 0, dp));
 
    else
        return dp[ind][st] = Math.max(arr[ind] +
                             findlength(arr, s, n,
                               ind + 1, 1, dp), 0);
}
 
// Returns length of substring which is
// having maximum difference of number
// of 0s and number of 1s
static int maxLen(String s, int n)
{
    // If all 1s return -1.
    if (allones(s, n))
        return -1;
 
    // Else find the length.
    int arr[] = new int[MAX];
    for (int i = 0; i < n; i++)
        arr[i] = (s.charAt(i) == '0' ? 1 : -1);
 
    int dp[][] = new int[MAX][3];
    for (int[] row : dp)
            Arrays.fill(row, -1);
    return findlength(arr, s, n, 0, 0, dp);
}
 
// Driver code
public static void main (String[] args)
{
    String s = "11000010001";
    int n = 11;
    System.out.println(maxLen(s, n));
}
}
 
// This code is contributed by Anant Agarwal.

Python3

# Python Program to find the length of
# substring with maximum difference of
# zeroes and ones in binary string.
MAX = 100
 
# Return true if there all 1s
def allones(s, n):
     
    # Checking each index
    # is 0 or not.
    co = 0
     
    for i in s:
        co += 1 if i == '1' else 0
 
    return co == n
 
# Find the length of substring with
# maximum difference of zeroes and
# ones in binary string
def findlength(arr, s, n, ind, st, dp):
     
    # If string is over
    if ind >= n:
        return 0
 
    # If the state is already calculated.
    if dp[ind][st] != -1:
        return dp[ind][st]
 
    if not st:
        dp[ind][st] = max(arr[ind] +
           findlength(arr, s, n, ind + 1, 1, dp),
            (findlength(arr, s, n, ind + 1, 0, dp)))
    else:
        dp[ind][st] = max(arr[ind] +
         findlength(arr, s, n, ind + 1, 1, dp), 0)
          
    return dp[ind][st]
 
# Returns length of substring which is
# having maximum difference of number
# of 0s and number of 1s
def maxLen(s, n):
     
    # If all 1s return -1.
    if allones(s, n):
        return -1
 
    # Else find the length.
    arr = [0] * MAX
    for i in range(n):
        arr[i] = 1 if s[i] == '0' else -1
 
    dp = [[-1] * 3 for _ in range(MAX)]
    return findlength(arr, s, n, 0, 0, dp)
 
# Driven Program
s = "11000010001"
n = 11
print(maxLen(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
{
    static int MAX = 100;
     
    // Return true if there all 1s
    public static bool allones(string s, int n)
    {
        // Checking each index is 0 or not.
        int co = 0;
        for (int i = 0; i < s.Length; i++)
            co += (s[i] == '1' ? 1 : 0);
 
        return (co == n);
    }
     
    // Find the length of substring with maximum
    // difference of zeroes and ones in binary
    // string
    public static int findlength(int[] arr, string s,
                    int n, int ind, int st, int[,] dp)
    {
        // If string is over.
        if (ind >= n)
            return 0;
     
        // If the state is already calculated.
        if (dp[ind,st] != -1)
            return dp[ind,st];
     
        if (st == 0)
            return dp[ind,st] = Math.Max(arr[ind] +
            findlength(arr, s, n, ind + 1, 1, dp),
            findlength(arr, s, n, ind + 1, 0, dp));
     
        else
            return dp[ind,st] = Math.Max(arr[ind] +
        findlength(arr, s, n, ind + 1, 1, dp), 0);
    }
     
    // Returns length of substring which is
    // having maximum difference of number
    // of 0s and number of 1s
    public static int maxLen(string s, int n)
    {
        // If all 1s return -1.
        if (allones(s, n))
            return -1;    
     
        // Else find the length.
        int[] arr = new int[MAX];
             
        for (int i = 0; i < n; i++)
            arr[i] = (s[i] == '0' ? 1 : -1);    
     
        int[,] dp = new int[MAX,3];
        for(int i = 0; i < MAX; i++)
            for(int j = 0; j < 3; j++)
                dp[i,j] = -1;
 
        return findlength(arr, s, n, 0, 0, dp);
    }
     
    // Driven Program
     
    static void Main()
    {
        string s = "11000010001";
        int n = 11;
        Console.Write(maxLen(s, n));
    }
    // This code is contributed by DrRoot_
}

Javascript

<script>
 
// Javascript Program to find the length of
// substring with maximum difference of
// zeroes and ones in binary string.
var MAX = 100;
 
// Return true if there all 1s
function allones( s,  n)
{
    // Checking each index is 0 or not.
    var co = 0;
    for (var i = 0; i < s.length; i++)
        co += (s[i] == '1');
 
    return (co == n);
}
 
// Find the length of substring with maximum
// difference of zeroes and ones in binary
// string
function findlength(arr, s, n, ind, st, dp)
{
    // If string is over.
    if (ind >= n)
        return 0;
 
    // If the state is already calculated.
    if (dp[ind][st] != -1)
        return dp[ind][st];
 
    if (st == 0)
        return dp[ind][st] = Math.max(arr[ind] +
          findlength(arr, s, n, ind + 1, 1, dp),
          findlength(arr, s, n, ind + 1, 0, dp));
 
    else
        return dp[ind][st] = Math.max(arr[ind] +
       findlength(arr, s, n, ind + 1, 1, dp), 0);
}
 
// Returns length of substring which is
// having maximum difference of number
// of 0s and number of 1s
function maxLen( s,  n)
{
    // If all 1s return -1.
    if (allones(s, n))
        return -1;   
 
    // Else find the length.
    var arr = Array(MAX).fill(0);
    for (var i = 0; i < n; i++)
        arr[i] = (s[i] == '0' ? 1 : -1);   
 
    var dp = Array.from(Array(MAX), ()=> Array(3).fill(-1));
    return findlength(arr, s, n, 0, 0, dp);
}
 
// Driven Program
var s = "11000010001";
var n = 11;
document.write( maxLen(s, n));
 
 
</script>
Producción

6

Complejidad de tiempo: O(2*len(s)), 
Espacio auxiliar: O(len(s))

Diferencia máxima de ceros y unos en string binaria | Conjunto 2 (tiempo O(n))

Publicación traducida automáticamente

Artículo escrito por anuj0503 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *