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