Given a string S consisting of N lowercase alphabets, the task is to find the length of the smallest substring in S whose occurrence is exactly 1.
Examples:
Input: S = “abaaba”
Output: 2
Explanation:
The smallest substring in the string S, whose occurrence is exactly 1 is “aa” . Length of this substring is 2.
Therefore, print 2.Input: S = “zyzyzyz”
Output: 5
Approach: To solve the problem, the idea is to generate all possible substring of the given string S and store the frequency of each substring in a HashMap. Now, traverse the HashMap and print the substring of minimum length whose frequency is 1.
Below is the implementation of the above approach:
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 occurences vector<string> a1; // Generate all the substrings for ( int i = 0; i < a.size(); i++) { for ( int j = i + 1; j < a.size(); j++) { // Avoid multiple occurences if (i != j) // Append all substrings a1.push_back(a.substr(i,j+1)); } } // Take into account // all the substrings map<string, int > a2; for (string i:a1) a2[i]++; vector<string> freshlist; // Iterate over all // unique substrings for ( auto i:a2) { // If frequency is 1 if (i.second == 1) // Append into fresh list freshlist.push_back(i.first); } // Initialize a dictionary map<string, int > dictionary; for ( auto i:freshlist) { // Append the keys dictionary[i] = i.size(); } vector< int > newlist; // Traverse the dictionary for ( auto i:dictionary) newlist.push_back(i.second); int ans = INT_MAX; for ( int i:newlist) ans = min(ans, i); // Print the minimum of dictionary return 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 occurences 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 occurences a1 = [] # Generate all the substrings for i in range ( len (a)): for j in range (i + 1 , len (a)): # Avoid multiple occurences 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)) |
2
Time Complexity: O(N2)
Auxiliary Space: O(N2)
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.