Dado un entero positivo N , la tarea es encontrar el número de strings binarias de longitud N que contiene «11» como substring.
Ejemplos:
Entrada: N = 2
Salida: 1
Explicación: La única string de longitud 2 que tiene «11» como substring es «11».Entrada: N = 12
Salida: 3719
Enfoque: la idea es derivar el número de posibilidades de tener «11» como substring para representaciones binarias que comiencen con 0 o 1 en función de las siguientes observaciones:
- Si el primer bit es 0 , entonces el bit inicial no contribuye a que la string tenga «11» como substring . Por lo tanto, los bits restantes (N – 1) deben formar una string que tenga «11 » como substring.
- Si el primer bit es 1 y el bit siguiente también es 1 , entonces existen 2 (N – 2) strings que tienen «11» como substring.
- Si el primer bit es 1 pero el bit siguiente es 0 , entonces se puede formar una string que tenga «11» como substring con los (N – 2) bits restantes .
- Por tanto, la relación de recurrencia para generar todas las strings binarias de longitud N es:
dp[i] = dp[i – 1] + dp[i – 2] + 2 (i – 2)
donde,
dp[i] es la string de longitud i que tiene “11” como substring.
y dp[0] = dp[1] = 0.
Siga los pasos a continuación para resolver el problema:
- Inicialice una array , digamos dp[] , de tamaño (N + 1) y asigne dp[0] como 0 y dp[1] como 0 .
- Calcule previamente las primeras N potencias de 2 y guárdelas en una array, digamos power[] .
- Iterar sobre el rango [2, N] y actualizar dp[i] como (dp[i – 1] + dp[i – 2] + power[i – 2]) .
- Después de completar los pasos anteriores, imprima el valor de dp[N] como resultado.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to count binary strings // of length N having substring "11" void binaryStrings(int N) { // Initialize dp[] of size N + 1 int dp[N + 1]; // Base Cases dp[0] = 0; dp[1] = 0; // Iterate over the range [2, N] for (int i = 2; i <= N; i++) { dp[i] = dp[i - 1] + dp[i - 2] + (1<<(i-2)); // 1<<(i-2) means power of 2^(i-2) } // Print total count of substrings cout << dp[N]; } // Driver Code int main() { int N = 12; binaryStrings(N); return 0; }
Java
// Java program for the above approach import java.util.*; class GFG{ // Function to count binary strings // of length N having substring "11" static void binaryStrings(int N) { // Initialize dp[] of size N + 1 int[] dp = new int[N + 1]; // Base Cases dp[0] = 0; dp[1] = 0; // Stores the first N powers of 2 int[] power = new int[N + 1]; power[0] = 1; // Generate for(int i = 1; i <= N; i++) { power[i] = 2 * power[i - 1]; } // Iterate over the range [2, N] for(int i = 2; i <= N; i++) { dp[i] = dp[i - 1] + dp[i - 2] + power[i - 2]; } // Print total count of substrings System.out.println(dp[N]); } // Driver Code public static void main(String[] args) { int N = 12; binaryStrings(N); } } // This code is contributed by ukasp
Python3
# Python3 program for the above approach # Function to count binary strings # of length N having substring "11" def binaryStrings(N): # Initialize dp[] of size N + 1 dp = [0]*(N + 1) # Base Cases dp[0] = 0 dp[1] = 0 # Stores the first N powers of 2 power = [0]*(N + 1) power[0] = 1 # Generate for i in range(1, N + 1): power[i] = 2 * power[i - 1] # Iterate over the range [2, N] for i in range(2, N + 1): dp[i] = dp[i - 1] + dp[i - 2] + power[i - 2] # Prtotal count of substrings print (dp[N]) # Driver Code if __name__ == '__main__': N = 12 binaryStrings(N) # This code is contributed by mohit kumar 29.
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG { // Function to count binary strings // of length N having substring "11" static void binaryStrings(int N) { // Initialize dp[] of size N + 1 int []dp = new int[N + 1]; // Base Cases dp[0] = 0; dp[1] = 0; // Stores the first N powers of 2 int []power = new int[N + 1]; power[0] = 1; // Generate for (int i = 1; i <= N; i++) { power[i] = 2 * power[i - 1]; } // Iterate over the range [2, N] for (int i = 2; i <= N; i++) { dp[i] = dp[i - 1] + dp[i - 2] + power[i - 2]; } // Print total count of substrings Console.WriteLine(dp[N]); } // Driver Code public static void Main() { int N = 12; binaryStrings(N); } } // This code is contributed by bgangwar59.
Javascript
<script> // JavaScript program for the above approach // Function to count binary strings // of length N having substring "11" function binaryStrings(N) { // Initialize dp of size N + 1 var dp = Array(N + 1).fill(0); // Base Cases dp[0] = 0; dp[1] = 0; // Stores the first N powers of 2 var power = Array(N+1).fill(0); power[0] = 1; // Generate for (i = 1; i <= N; i++) { power[i] = 2 * power[i - 1]; } // Iterate over the range [2, N] for (i = 2; i <= N; i++) { dp[i] = dp[i - 1] + dp[i - 2] + power[i - 2]; } // Print total count of substrings document.write(dp[N]); } // Driver Code var N = 12; binaryStrings(N); // This code contributed by aashish1995 </script>
3719
Complejidad temporal: O(N)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por ManikantaBandla y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA