Cuente el número de strings binarias sin 1 consecutivos

Dado un entero positivo N, cuente todas las posibles strings binarias distintas de longitud N de modo que no haya unos consecutivos.

Ejemplos: 

Input:  N = 2
Output: 3
// The 3 strings are 00, 01, 10

Input: N = 3
Output: 5
// The 5 strings are 000, 001, 010, 100, 101

Este problema se puede resolver usando Programación Dinámica. Sea a[i] el número de strings binarias de longitud i que no contienen dos 1 consecutivos y que terminan en 0. De manera similar, sea b[i] el número de tales strings que terminan en 1. Podemos agregar 0 o 1 a una string que termina en 0, pero solo podemos agregar 0 a una string que termina en 1. Esto produce la relación de recurrencia: 

a[i] = a[i - 1] + b[i - 1]
b[i] = a[i - 1] 

Los casos base de la recurrencia anterior son a[1] = b[1] = 1. El número total de strings de longitud i es solo a[i] + b[i].
A continuación se muestra la implementación de la solución anterior. En la siguiente implementación, los índices comienzan desde 0. Por lo tanto, a[i] representa el número de strings binarias para la longitud de entrada i+1. De manera similar, b[i] representa strings binarias para la longitud de entrada i+1.

Implementación:

C++

// C++ program to count all distinct binary strings
// without two consecutive 1's
#include <iostream>
using namespace std;
 
int countStrings(int n)
{
    int a[n], b[n];
    a[0] = b[0] = 1;
    for (int i = 1; i < n; i++)
    {
        a[i] = a[i-1] + b[i-1];
        b[i] = a[i-1];
    }
    return a[n-1] + b[n-1];
}
 
 
// Driver program to test above functions
int main()
{
    cout << countStrings(3) << endl;
    return 0;
}

Java

class Subset_sum
{
    static  int countStrings(int n)
    {
        int a[] = new int [n];
        int b[] = new int [n];
        a[0] = b[0] = 1;
        for (int i = 1; i < n; i++)
        {
            a[i] = a[i-1] + b[i-1];
            b[i] = a[i-1];
        }
        return a[n-1] + b[n-1];
    }
    /* Driver program to test above function */
    public static void main (String args[])
    {
          System.out.println(countStrings(3));
    }
}/* This code is contributed by Rajat Mishra */

Python3

# Python program to count
# all distinct binary strings
# without two consecutive 1's
 
def countStrings(n):
 
    a=[0 for i in range(n)]
    b=[0 for i in range(n)]
    a[0] = b[0] = 1
    for i in range(1,n):
        a[i] = a[i-1] + b[i-1]
        b[i] = a[i-1]
     
    return a[n-1] + b[n-1]
 
# Driver program to test
# above functions
 
print(countStrings(3))
 
# This code is contributed
# by Anant Agarwal.

C#

// C# program to count all distinct binary
// strings without two consecutive 1's
using System;
 
class Subset_sum
{
    static int countStrings(int n)
    {
        int []a = new int [n];
        int []b = new int [n];
        a[0] = b[0] = 1;
        for (int i = 1; i < n; i++)
        {
            a[i] = a[i-1] + b[i-1];
            b[i] = a[i-1];
        }
        return a[n-1] + b[n-1];
    }
     
    // Driver Code
    public static void Main ()
    {
        Console.Write(countStrings(3));
    }
}
 
// This code is contributed by nitin mittal

PHP

<?php
// PHP program to count all distinct
// binary stringswithout two
// consecutive 1's
 
function countStrings($n)
{
    $a[$n] = 0;
    $b[$n] = 0;
    $a[0] = $b[0] = 1;
    for ($i = 1; $i < $n; $i++)
    {
        $a[$i] = $a[$i - 1] +
                 $b[$i - 1];
        $b[$i] = $a[$i - 1];
    }
    return $a[$n - 1] +
           $b[$n - 1];
}
 
    // Driver Code
    echo countStrings(3) ;
 
// This code is contributed by nitin mittal
?>

Javascript

<script>
 
// JavaScript program to count all
// distinct binary strings
// without two consecutive 1's
function countStrings(n)
{
    let a = [];
    let b = [];
    a[0] = b[0] = 1;
     
    for(let i = 1; i < n; i++)
    {
        a[i] = a[i - 1] + b[i - 1];
        b[i] = a[i - 1];
    }
    return a[n - 1] + b[n - 1];
}
 
// Driver code
document.write(countStrings(3));
 
// This code is contributed by rohan07
 
</script>
Producción

5

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Fuente: 

Si observamos más de cerca el patrón, podemos observar que el conteo es en realidad (n+2) el número de Fibonacci para n >= 1. Los números de Fibonacci son 0, 1, 1, 2, 3, 5, 8 , 13, 21, 34, 55, 89, 141, …. 

n = 1, count = 2  = fib(3)
n = 2, count = 3  = fib(4)
n = 3, count = 5  = fib(5)
n = 4, count = 8  = fib(6)
n = 5, count = 13 = fib(7)
................

Por lo tanto, podemos contar las strings en tiempo O (Log n) también usando el método 5 aquí .

Otro método :-

Del método anterior, está claro que solo queremos el valor anterior en el bucle for, lo que también podemos hacer reemplazando la array con la variable.

A continuación se muestra la implementación del enfoque anterior: – 

C++

// C++ program to count all distinct binary strings
// without two consecutive 1's
#include <bits/stdc++.h>
using namespace std;
 
int countStrings(int n)
{
    int a = 1, b = 1;
    for (int i = 1; i < n; i++) {
        // Here we have used the temp variable because we
        // want to assign the older value of a to b
        int temp = a + b;
        b = a;
        a = temp;
    }
    return a + b;
}
 
// Driver program to test above functions
int main()
{
    cout << countStrings(3) << endl;
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

Java

class Subset_sum {
    static int countStrings(int n)
    {
        int a = 1;
        int b = 1;
        for (int i = 1; i < n; i++) {
            // Here we have used the temp variable because
            // we want to assign the older value of a to b
            int temp = a + b;
            b = a;
            a = temp;
        }
        return a + b;
    }
    /* Driver program to test above function */
    public static void main(String args[])
    {
        System.out.println(countStrings(3));
    }
}
 
// This code is contributed by Aditya Kumar (adityakumar129)
Producción

5

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación relacionada: 
números de 1 a n bits sin 1 consecutivos en representación binaria.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *