Smallest substring occurring only once in a given string
Last Updated :
10 Jan, 2023
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>
Time Complexity: O(N2)
Auxiliary Space: O(N2)
Similar Reads
K-th lexicographically smallest unique substring of a given string Given a string S. The task is to print the K-th lexicographically the smallest one among the different substrings of s.A substring of s is a string obtained by taking out a non-empty contiguous part in s. For example, if s = ababc, a, bab and ababc are substrings of s, while ac, z, and an empty stri
5 min read
Lexicographically smallest string with given string as prefix Given an array arr[] consisting of N strings and a string S if size M, the task is to find the lexicographically smallest string consisting of the string S as the prefix. If there doesn't exist any string starting with prefix S then print "-1". Examples: Input: arr[] = {"apple", "appe", "apl", "aapl
6 min read
Minimum size lexicographically smallest string which is not a substring of given string Given a string s, the task is to find the lexicographically smallest string of minimum characters that do not exist as a substring in S. Examples: Input: S = "aabacdefghijklmnopqrstuvwxyz"Output: adExplanation: All the single digit strings from [a-z] occur in the given string and in two character st
7 min read
Lexicographically smallest string which is not a subsequence of given string Given a string S, the task is to find the string which is lexicographically smallest and not a subsequence of the given string S. Examples: Input: S = "abcdefghijklmnopqrstuvwxyz"Output: aaExplanation:String "aa" is the lexicographically smallest string which is not present in the given string as a
5 min read
Smallest String consisting of a String S exactly K times as a Substring Given a string S of length N and integer K, find the smallest length string which contains the string S as a sub string exactly K times. Examples: Input: S = "abba", K = 3 Output: abbabbabba Explanation: The string "abba" occurs K times in the string abbabbabba, i.e. {abbabbabba, abbabbabba, abbabba
6 min read