Dada la string str de tamaño N que contiene letras mayúsculas y minúsculas y un número entero K . La tarea es encontrar el recuento de substrings que contengan exactamente K vocales distintas.
Ejemplos:
Entrada: str = “aeiou”, K = 2
Salida: 4
Explicación: Las substrings que tienen dos vocales distintas son “ae”, “ei”, “io” y “ou”.Entrada: str = “TrueGoik”, K = 3
Salida: 5
Explicación: Las substrings son “TrueGo”, “rueGo”, “ueGo”, “eGoi” y “eGoik”.
Enfoque: el problema se puede resolver generando todas las substrings. De las substrings generadas, cuente las que tienen K vocales distintas. Siga los pasos que se mencionan a continuación para implementar el enfoque:
- Primero genere todas las substrings a partir de cada índice i en el rango [0, N]
- Luego, para cada substring, siga los pasos:
- Mantenga una array hash para almacenar las ocurrencias de vocales únicas.
- Compruebe si un nuevo carácter en la substring es una vocal o no.
- Si es una vocal, incremente su ocurrencia en el hash y mantenga un conteo de vocales distintas encontradas
- Ahora, para cada substring, si el recuento distinto de vocales es K , incremente el recuento final .
- Si para cualquier ciclo para encontrar substrings que comiencen desde i , el recuento de vocales distintas excede K , o si la longitud de la substring ha alcanzado la longitud de la string, rompa el ciclo y busque substrings que comiencen desde i+1 .
- Cuando se hayan considerado todas las substrings, imprima el recuento final.
A continuación se muestra la implementación del enfoque anterior.
C++
// C++ program to count number of substrings // with exactly k distinct vowels #include <bits/stdc++.h> using namespace std; #define MAX 128 // Function to check whether // a character is vowel or not bool isVowel(char x) { return (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u' || x == 'A' || x == 'E' || x == 'I' || x == 'O' || x == 'U'); } int getIndex(char ch) { return (ch - 'A' > 26 ? ch - 'a' : ch - 'A'); } // Function to count number of substrings // with exactly k unique vowels int countkDist(string str, int k) { int n = str.length(); // Initialize result int res = 0; // Consider all substrings // beginning with str[i] for (int i = 0; i < n; i++) { int dist_count = 0; // To store count of characters // from 'a' to 'z' vector<int> cnt(26, 0); // Consider all substrings // between str[i..j] for (int j = i; j < n; j++) { // If this is a new vowels // for this substring, // increment dist_count. if (isVowel(str[j]) && cnt[getIndex(str[j])] == 0) dist_count++; // Increment count of // current character cnt[getIndex(str[j])]++; // If distinct vowels count // becomes k then increment result if (dist_count == k) res++; if (dist_count > k) break; } } return res; } // Driver code int main() { string str = "TrueGoik"; int K = 3; cout << countkDist(str, K) << endl; return 0; }
Java
// Java program to count number of substrings // with exactly k distinct vowels import java.util.*; public class GFG { // Function to check whether // a character is vowel or not static boolean isVowel(char x) { return (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u' || x == 'A' || x == 'E' || x == 'I' || x == 'O' || x == 'U'); } static int getIndex(char ch) { return (ch - 'A' > 26 ? ch - 'a' : ch - 'A'); } // Function to count number of substrings // with exactly k unique vowels static int countkDist(String str, int k) { int n = str.length(); // Initialize result int res = 0; // Consider all substrings // beginning with str[i] for (int i = 0; i < n; i++) { int dist_count = 0; // To store count of characters // from 'a' to 'z' int cnt[] = new int[26]; for(int t = 0; t < 26; t++) { cnt[t] = 0; } // Consider all substrings // between str[i..j] for (int j = i; j < n; j++) { // If this is a new vowels // for this substring, // increment dist_count. if (isVowel(str.charAt(j)) && cnt[getIndex(str.charAt(j))] == 0) dist_count++; // Increment count of // current character cnt[getIndex(str.charAt(j))]++; // If distinct vowels count // becomes k then increment result if (dist_count == k) res++; if (dist_count > k) break; } } return res; } // Driver code public static void main(String args[]) { String str = "TrueGoik"; int K = 3; System.out.println(countkDist(str, K)); } } // This code is contributed by Samim Hossain Mondal.
Python3
# Python code for the above approach # Function to check whether # a character is vowel or not def isVowel(x): return (x == 'a' or x == 'e' or x == 'i' or x == 'o' or x == 'u' or x == 'A' or x == 'E' or x == 'I' or x == 'O' or x == 'U') def getIndex(ch): return (ord(ch) - ord('a')) if (ord(ch) - ord('A')) > 26 else (ord(ch) - ord('A')) # Function to count number of substrings # with exactly k unique vowels def countkDist(str, k): n = len(str) # Initialize result res = 0 # Consider all substrings # beginning with str[i] for i in range(n): dist_count = 0 # To store count of characters # from 'a' to 'z' cnt = [0] * 26 # Consider all substrings # between str[i..j] for j in range(i, n): # If this is a new vowels # for this substring, # increment dist_count. if (isVowel(str[j]) and cnt[getIndex(str[j])] == 0): dist_count += 1 # Increment count of # current character cnt[getIndex(str[j])] += 1 # If distinct vowels count # becomes k then increment result if (dist_count == k): res += 1 if (dist_count > k): break return res # Driver code s = "TrueGoik" K = 3 print(countkDist(s, K)) # This code is contributed by Saurabh Jaiswal
C#
// C# program to count number of substrings // with exactly k distinct vowels using System; class GFG { // Function to check whether // a character is vowel or not static bool isVowel(char x) { return (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u' || x == 'A' || x == 'E' || x == 'I' || x == 'O' || x == 'U'); } static int getIndex(char ch) { return (ch - 'A' > 26 ? ch - 'a' : ch - 'A'); } // Function to count number of substrings // with exactly k unique vowels static int countkDist(string str, int k) { int n = str.Length; // Initialize result int res = 0; // Consider all substrings // beginning with str[i] for (int i = 0; i < n; i++) { int dist_count = 0; // To store count of characters // from 'a' to 'z' int []cnt = new int[26]; for(int t = 0; t < 26; t++) { cnt[t] = 0; } // Consider all substrings // between str[i..j] for (int j = i; j < n; j++) { // If this is a new vowels // for this substring, // increment dist_count. if (isVowel(str[j]) && cnt[getIndex(str[j])] == 0) dist_count++; // Increment count of // current character cnt[getIndex(str[j])]++; // If distinct vowels count // becomes k then increment result if (dist_count == k) res++; if (dist_count > k) break; } } return res; } // Driver code public static void Main() { string str = "TrueGoik"; int K = 3; Console.Write(countkDist(str, K)); } } // This code is contributed by Samim Hossain Mondal.
Javascript
<script> // JavaScript code for the above approach // Function to check whether // a character is vowel or not function isVowel(x) { return (x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u' || x == 'A' || x == 'E' || x == 'I' || x == 'O' || x == 'U'); } function getIndex(ch) { return ((ch.charCodeAt(0) - 'A'.charCodeAt(0)) > 26 ? (ch.charCodeAt(0) - 'a'.charCodeAt(0)) : (ch.charCodeAt(0) - 'A'.charCodeAt(0))); } // Function to count number of substrings // with exactly k unique vowels function countkDist(str, k) { let n = str.length; // Initialize result let res = 0; // Consider all substrings // beginning with str[i] for (let i = 0; i < n; i++) { let dist_count = 0; // To store count of characters // from 'a' to 'z' let cnt = new Array(26).fill(0) // Consider all substrings // between str[i..j] for (let j = i; j < n; j++) { // If this is a new vowels // for this substring, // increment dist_count. if (isVowel(str[j]) && cnt[getIndex(str[j])] == 0) dist_count++; // Increment count of // current character cnt[getIndex(str[j])]++; // If distinct vowels count // becomes k then increment result if (dist_count == k) res++; if (dist_count > k) break; } } return res; } // Driver code let s = "TrueGoik"; let K = 3 document.write(countkDist(s, K)); // This code is contributed by Potta Lokesh </script>
5
Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N 2 )