Skip to content
Related Articles

Related Articles

Smallest substring occurring only once in a given string
  • Difficulty Level : Basic
  • Last Updated : 18 Mar, 2021

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))
Output: 
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.

My Personal Notes arrow_drop_up
Recommended Articles
Page :