Open In App

Smallest substring occurring only once in a given string

Last Updated : 10 Jan, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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 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))


C#




using System;
using System.Collections.Generic;
using System.Linq;
 
class GFG
{
  // Function to find the smallest
  // substring occurring only once
  static int SmallestSubstring(string a)
  {
    // Stores all occurrences
    var a1 = new List<string>();
 
    // 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 - i));
      }
    }
 
    // Take into account
    // all the substrings
    var a2 = new Dictionary<string, int>();
    foreach (string s in a1)
      if (a2.ContainsKey(s))
        a2[s]++;
    else
      a2[s] = 1;
 
    var freshlist = new List<string>();
 
    // Iterate over all
    // unique substrings
    foreach (string s in a2.Keys)
    {
      // If frequency is 1
      if (a2[s] == 1)
 
        // Append into fresh list
        freshlist.Add(s);
    }
 
    // Initialize a dictionary
    var dictionary = new Dictionary<string, int>();
 
    foreach (string s in freshlist)
    {
      // Append the keys
      dictionary[s] = s.Length;
    }
 
    var newlist = new List<int>();
 
    // Traverse the dictionary
    foreach (string s in dictionary.Keys)
      newlist.Add(dictionary[s]);
 
    int ans = int.MaxValue;
 
    foreach (int i in newlist)
      ans = Math.Min(ans, i);
 
    // Return the minimum of dictionary
    return ans == int.MaxValue ? 0 : ans;
  }
 
  // Driver Code
  static void Main(string[] args)
  {
    string S = "ababaabba";
 
    Console.WriteLine(SmallestSubstring(S));
  }
}
 
 
// This code is contributed by phasing17


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>


Output: 

2

 

Time Complexity: O(N2)
Auxiliary Space: O(N2) 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads