# DESAFIO BCI ## EJERCICIO 2 > De un *string* binario (conformado por ceros y unos) y retornar la cantidad de todos los *substrings* que tengan la misma cantidad de ceros y de unos, con la condición de que tanto los ceros como los unos de los *substrings* sean consecutivos 1. **ANÁLISIS** - Lo primero es entender lo que se pide. Básicamente es tomar todos los posibles *substrings* dado un *string* de entrada - Si consideramos el hecho de que los *substrings* que cumplen la condición debe tener la misma cantidad de ceros que de unos, entonces podemos **descartar** todos los ***substrings* impares** - Teniendo ya *substrings* pares dentro de nuestro grupo de "posibles candidatos", ahora debemos evaluar si cumplen la condición de tener la **misma cantidad** de **ceros y unos consecutivos**. Para ello, debemos tomar cada *substring* y evaluar su primer mitad. Si en esa primer mitad sólo tenemos unos, en la segunda mitad sólo debemos tener ceros, y viceversa 2. **EJEMPLO** - Supongamos que recibimos el *string* `011001`, acá todos los posibles *substrings* **pares** son: - `01` - `11` - `10` - `01` - `0110` - `1100` - `1001` - Notar que hay otros *substrings*, pero estos no nos sirven por ser impares y, en consecuencia, nunca tendrán la misma cantidad de ceros que de unos. Lo siguiente es tomar cada *substring* y analizar su primer mitad y su segunda mitad, de manera que si la primer mitad sólo tiene unos, la segunda sólo debe tener ceros. De esta forma evaluamos las dos condiciones: (a) que tengan la misma cantidad de ceros que de unos y (b) que los ceros y unos sean consecutivos. Para cada *substring* que cumpla, tendremos un contador para finalmente tener el total de *substrings* que cumplen lo solicitado - `01`. Primer mitad `0` ¿sólo unos/ceros? **Sí, sólo ceros**. Segunda mitad `1` ¿sólo unos? **Sí, sólo unos**. **Contador = 1** - `11` Primer mitad `1` ¿sólo unos/ceros? **Sí, sólo unos**. Segunda mitad `1` ¿sólo ceros? **No** - `10` Primer mitad `1` ¿sólo unos/ceros? **Sí, sólo unos**. Segunda mitad `0` ¿sólo ceros? **Sí, sólo ceros**. **Contador = 2** - `01` Primer mitad `0` ¿sólo unos/ceros? **Sí, sólo ceros**. Segunda mitad `1` ¿sólo unos? **Sí, sólo unos**. **Contador = 3** - `0110` Primer mitad `01` ¿sólo unos/ceros? **No** - `1100` Primer mitad `11` ¿sólo unos/ceros? **Sí, sólo unos**. Segunda mitad `00` ¿sólo ceros? **Sí, sólo ceros**. **Contador = 4** - `1001` Primer mitad `10` ¿sólo unos/ceros? **No** - **Contador final = 4** 3. **VB.NET C#** ```java= using System; using System.Collections.Generic; namespace test_BCI { public class Funciones { public int ContarSubstrings(string entrada) { string subString; List<string> LstsubString = new List<string>(); //Recorrer string enviado {entrada} for (int i = 0; i < entrada.Length; i++) { for (int j = i; j < entrada.Length; j++) { subString = entrada.Substring(i, j - i + 1); //dividir en 2 para ver si son pares if (subString.Length % 2 == 0) LstsubString.Add(subString); } } //variable para contar los ceros del string int ceros; //variable para contar los unos del string int unos; //variable para contar cadenas correctas int contador = 0; //vatiable para recorrer string en caso de true bool resultado = true; //variables para sub dividir string char primerCaracter; char[] arregloDeChar; foreach (string aEvaluar in LstsubString) { unos = 0; ceros = 0; //contamos los ceros foreach (char cero in aEvaluar) if (cero == '0') ceros++; //contamos los unos foreach (char uno in aEvaluar) if (uno == '1') unos++; //si los unos y ceros son iguales, avanzamos if (ceros == unos) { //re-seteamos las variables anteriores ceros = 0; unos = 0; //tomamos el primer caracter primerCaracter = Convert.ToChar(aEvaluar.Substring(0, 1)); arregloDeChar = aEvaluar.ToCharArray(); int largoMitad = (aEvaluar.Length / 2) ; resultado = true; if (primerCaracter == '0') { //evaluamos la primer mitad for (int k = 1; k < largoMitad; k++) { //Siempre que sea verdadero se cumple la condicion if (resultado) { if (arregloDeChar[k] == '0') { resultado = true; } else { resultado = false; break; //salimos del for } } } //Se evalua la segunda mitad for (int l = largoMitad; l < aEvaluar.Length; l++) { //Siempre que sea verdadero se cumple la condicion if (resultado) { if (arregloDeChar[l] == '1') { resultado = true; } else { resultado = false; break; //salimos del for } } } } //repetimos el proceso, pero considerando que el primer caracter del substring es uno else { //evaluamos la primer mitad for (int k = 1; k < largoMitad; k++) { //Siempre que sea verdadero se cumple la condicion if (resultado) { if (arregloDeChar[k] == '1') { resultado = true; } else { resultado = false; break; //salimos del for } } } //evaluamos la segunda mitad for (int l = largoMitad; l < aEvaluar.Length; l++) { //Siempre que sea verdadero se cumple la condicion if (resultado) { if (arregloDeChar[l] == '0') { resultado = true; } else { resultado = false; break; //salimos del for } } } } } //Si se cumplen las condiciones sumas ++ al contador if (resultado) contador++; } return contador; } } class Program { static void Main(string[] args) { Funciones ClsFunciones = new Funciones(); int cont = ClsFunciones.ContarSubstrings("011001"); Console.WriteLine(cont); } } } ```