Dada una string S que consta de N letras minúsculas, la tarea es encontrar la longitud de la substring más pequeña en S cuya ocurrencia es exactamente 1 .
Ejemplos:
Entrada: S = “abaaba”
Salida: 2
Explicación:
La substring más pequeña en la string S, cuya ocurrencia es exactamente 1 es “aa”. La longitud de esta substring es 2.
Por lo tanto, imprima 2.Entrada: S = “zyzyzyz”
Salida: 5
Enfoque: para resolver el problema, la idea es generar todas las substrings posibles de la string S dada y almacenar la frecuencia de cada substring en un HashMap . Ahora, recorra el HashMap e imprima la substring de longitud mínima cuya frecuencia es 1 .
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 find the smallest // substring occurring only once int smallestSubstring(string a) { // Stores all occurrences vector<string> subStrings; int n = a.size(); // Generate all the substrings for (int i = 0; i < n; i++) for (int len = 1; len <= n - i; len++) subStrings.push_back(a.substr(i, len)); // Take into account // all the substrings map<string,int> subStringsFreq; for(string i: subStrings) { subStringsFreq[i]++; } // Iterate over all // unique substrings int ans = INT_MAX; for (auto str : subStringsFreq) { if (str.second == 1){ //Find minimum length of substring int str_len = str.first.size(); ans = min(ans, str_len); } } // return 0 if no such substring exists return ans == INT_MAX ? 0 : ans; } // Driver Code int main() { string S = "ababaabba"; cout<<smallestSubstring(S); return 0; } // This code is contributed by mohit kumar 29.
Java
// Java program for the above approach import java.io.*; import java.lang.*; import java.util.*; class GFG{ // Function to find the smallest // substring occurring only once static int smallestSubstring(String a) { // Stores all occurrences ArrayList<String> a1 = new ArrayList<>(); // Generate all the substrings for(int i = 0; i < a.length(); i++) { for(int j = i + 1; j <= a.length(); j++) { // Avoid multiple occurences if (i != j) // Append all substrings a1.add(a.substring(i, j)); } } // Take into account // all the substrings TreeMap<String, Integer> a2 = new TreeMap<>(); for(String s : a1) a2.put(s, a2.getOrDefault(s, 0) + 1); ArrayList<String> freshlist = new ArrayList<>(); // Iterate over all // unique substrings for(String s : a2.keySet()) { // If frequency is 1 if (a2.get(s) == 1) // Append into fresh list freshlist.add(s); } // Initialize a dictionary TreeMap<String, Integer> dictionary = new TreeMap<>(); for(String s : freshlist) { // Append the keys dictionary.put(s, s.length()); } ArrayList<Integer> newlist = new ArrayList<>(); // Traverse the dictionary for(String s : dictionary.keySet()) newlist.add(dictionary.get(s)); int ans = Integer.MAX_VALUE; for(int i : newlist) ans = Math.min(ans, i); // Return the minimum of dictionary return ans == Integer.MAX_VALUE ? 0 : ans; } // Driver Code public static void main(String[] args) { String S = "ababaabba"; System.out.println(smallestSubstring(S)); } } // This code is contributed by Kingash
Python3
# Python3 program of the above approach from collections import Counter # Function to find the smallest # substring occurring only once def smallestSubstring(a): # Stores all occurrences a1 = [] # Generate all the substrings for i in range(len(a)): for j in range(i+1, len(a)): # Avoid multiple occurrences if i != j: # Append all substrings a1.append(a[i:j+1]) # Take into account # all the substrings a2 = Counter(a1) freshlist = [] # Iterate over all # unique substrings for i in a2: # If frequency is 1 if a2[i] == 1: # Append into fresh list freshlist.append(i) # Initialize a dictionary dictionary = dict() for i in range(len(freshlist)): # Append the keys dictionary[freshlist[i]] = len(freshlist[i]) newlist = [] # Traverse the dictionary for i in dictionary: newlist.append(dictionary[i]) # Print the minimum of dictionary return(min(newlist)) # Driver Code S = "ababaabba" print(smallestSubstring(S))
Javascript
<script> // JavaScript program for the above approach // Function to find the smallest // substring occurring only once function smallestSubstring(a) { // Stores all occurrences let a1 = []; // Generate all the substrings for(let i = 0; i < a.length; i++) { for(let j = i + 1; j <= a.length; j++) { // Avoid multiple occurrences if (i != j) // Append all substrings a1.push(a.substring(i, j)); } } // Take into account // all the substrings let a2 = new Map(); for(let s=0;s<a1.length;s++) { if(a2.has(a1[s])) a2.set(a1[s],a2.get(a1[s])+1); else a2.set(a1[s],1); } let freshlist = []; // Iterate over all // unique substrings for(let s of a2.keys()) { // If frequency is 1 if (a2.get(s) == 1) // Append into fresh list freshlist.push(s); } // Initialize a dictionary let dictionary = new Map(); for(let s=0;s<freshlist.length;s++) { // Append the keys dictionary.set(freshlist[s], freshlist[s].length); } let newlist = []; // Traverse the dictionary for(let s of dictionary.keys()) newlist.push(dictionary.get(s)); let ans = Number.MAX_VALUE; for(let i=0;i<newlist.length;i++) ans = Math.min(ans, newlist[i]); // Return the minimum of dictionary return ans == Number.MAX_VALUE ? 0 : ans; } // Driver Code let S = "ababaabba"; document.write(smallestSubstring(S)); // This code is contributed by unknown2108 </script>
2
Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N 2 )
Publicación traducida automáticamente
Artículo escrito por saikumarkudikala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA