Given string str, the task is to split the string into the maximum number of unique substrings possible and print their count.
Examples:
Input: str = “ababccc”
Output: 5
Explanation:
Split the given string into the substrings “a”, “b”, “ab”, “c” and “cc”.
Therefore, the maximum count of unique substrings is 5.Input: str = “aba”
Output: 2
Approach: The problem can be solved by the Greedy approach. Follow the steps below to solve the problem:
- Initialize a Set S.
- Iterate over the characters of the string str and for each i and find the substring up to that index.
- If the given substring is not present in the Set S, insert it updates the maximum count, and remove it from the Set, because the same character cannot be reused.
- Return the maximum count.
Below is the implementation of the above approach:
C++
// CPP program for the above approach #include<bits/stdc++.h> using namespace std;
// Utility function to find maximum count of // unique substrings by splitting the string int maxUnique(string S, set<string> st)
{ // Stores maximum count of unique substring
// by splitting the string into substrings
int mx = 0;
// Iterate over the characters of the string
for ( int i = 1; i <= S.length(); i++)
{
// Stores prefix substring
string tmp = S.substr(0, i);
// Check if the current substring
// already exists
if (st.find(tmp) == st.end())
{
// Insert tmp into set
st.insert(tmp);
// Recursively call for remaining
// characters of string
mx = max(mx, maxUnique(S.substr(i), st) + 1);
// Remove from the set
st.erase(tmp);
}
}
// Return answer
return mx;
} // Function to find the maximum count of // unique substrings by splitting a string // into maximum number of unique substrings int maxUniqueSplit(string S)
{ set<string> st;
return maxUnique(S, st);
} // Driver Code int main()
{ string S = "ababccc" ;
int res = maxUniqueSplit(S);
cout<<res;
} // This code is contributed by jana_sayantan. |
Java
// Java program for the above approach import java.io.*;
import java.util.*;
class Solution {
// Function to find the maximum count of
// unique substrings by splitting a string
// into maximum number of unique substrings
public int maxUniqueSplit(String S)
{
return maxUnique(S, new HashSet<String>());
}
// Utility function to find maximum count of
// unique substrings by splitting the string
public int maxUnique(String S, Set<String> set)
{
// Stores maximum count of unique substring
// by splitting the string into substrings
int max = 0 ;
// Iterate over the characters of the string
for ( int i = 1 ; i <= S.length(); i++) {
// Stores prefix substring
String tmp = S.substring( 0 , i);
// Check if the current substring
// already exists
if (!set.contains(tmp)) {
// Insert tmp into set
set.add(tmp);
// Recursively call for remaining
// characters of string
max = Math.max(max, maxUnique(
S.substring(i), set)
+ 1 );
// Remove from the set
set.remove(tmp);
}
}
// Return answer
return max;
}
} // Driver Code class GFG {
public static void main(String[] args)
{
Solution st = new Solution();
String S = "ababccc" ;
int res = st.maxUniqueSplit(S);
System.out.println(res);
}
} |
Python3
# Python3 program for the above approach # Utility function to find maximum count of # unique substrings by splitting the string def maxUnique(S):
global d
# Stores maximum count of unique substring
# by splitting the string into substrings
maxm = 0
# Iterate over the characters of the string
for i in range ( 1 , len (S) + 1 ):
# Stores prefix substring
tmp = S[ 0 :i]
# Check if the current substring
# already exists
if (tmp not in d):
# Insert tmp into set
d[tmp] = 1
# Recursively call for remaining
# characters of string
maxm = max (maxm, maxUnique(S[i:]) + 1 )
# Remove from the set
del d[tmp]
# Return answer
return maxm
# Driver Code if __name__ = = '__main__' :
# Solution st = new Solution()
S = "ababccc"
d = {}
res = maxUnique(S)
# d = {}
print (res)
# This code is contributed by mohit kumar 29. |
C#
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG {
// Function to find the maximum count of
// unique substrings by splitting a string
// into maximum number of unique substrings
public int maxUniqueSplit(String S)
{
return maxUnique(S, new HashSet<String>());
}
// Utility function to find maximum count of
// unique substrings by splitting the string
public int maxUnique(String S, HashSet<String> set )
{
// Stores maximum count of unique substring
// by splitting the string into substrings
int max = 0;
// Iterate over the characters of the string
for ( int i = 1; i <= S.Length; i++) {
// Stores prefix substring
String tmp = S.Substring(0, i);
// Check if the current substring
// already exists
if (! set .Contains(tmp)) {
// Insert tmp into set
set .Add(tmp);
// Recursively call for remaining
// characters of string
max = Math.Max(max, maxUnique(
S.Substring(i), set )
+ 1);
// Remove from the set
set .Remove(tmp);
}
}
// Return answer
return max;
}
} // Driver Code public class GFG {
public static void Main(String[] args)
{
Solution st = new Solution();
String S = "ababccc" ;
int res = st.maxUniqueSplit(S);
Console.WriteLine(res);
}
} // This code contributed by shikhasingrajput |
Javascript
<script> // Javascript program for the above approach // Utility function to find maximum count of // unique substrings by splitting the string function maxUnique(S, st)
{ // Stores maximum count of unique substring
// by splitting the string into substrings
var mx = 0;
// Iterate over the characters of the string
for ( var i = 1; i <= S.length; i++)
{
// Stores prefix substring
var tmp = S.substring(0, i);
// Check if the current substring
// already exists
if (!st.has(tmp))
{
// Insert tmp into set
st.add(tmp);
// Recursively call for remaining
// characters of string
mx = Math.max(mx, maxUnique(S.substring(i), st) + 1);
// Remove from the set
st. delete (tmp);
}
}
// Return answer
return mx;
} // Function to find the maximum count of // unique substrings by splitting a string // into maximum number of unique substrings function maxUniqueSplit(S)
{ var st = new Set();
return maxUnique(S, st);
} // Driver Code var S = "ababccc" ;
var res = maxUniqueSplit(S);
document.write( res); </script> |
Output:
5
Time Complexity: O(
Auxiliary Space: O(N)