# Smallest substring occurring only once in a given string

• Difficulty Level : Easy
• Last Updated : 18 Apr, 2022

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 ``using` `namespace` `std;` `// Function to find the smallest``// substring occurring only once``int` `smallestSubstring(string a)``{` `    ``// Stores all occurrences``    ``vector 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 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<

## 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 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 a2 = ``new` `TreeMap<>();``    ``for``(String s : a1)``        ``a2.put(s, a2.getOrDefault(s, ``0``) + ``1``);` `    ``ArrayList 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 dictionary = ``new` `TreeMap<>();` `    ``for``(String s : freshlist)``    ``{``        ` `        ``// Append the keys``        ``dictionary.put(s, s.length());``    ``}` `    ``ArrayList 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

 ``

Output:

`2`

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

My Personal Notes arrow_drop_up