Given a string str, the task is to find the count of distinct characters in all the distinct sub-strings of the given string.
Examples:
Input: str = “ABCA”
Output: 18
Distinct sub-strings Distinct characters A 1 AB 2 ABC 3 ABCA 3 B 1 BC 2 BCA 3 C 1 CA 2 Hence, 1 + 2 + 3 + 3 + 1 + 2 + 3 + 1 + 2 = 18
Input: str = “AAAB”
Output: 10
Approach: Take all possible sub-strings of the given string and use a set to check whether the current sub-string has been processed before. Now, for every distinct sub-string, count the distinct characters in it (again set can be used to do so). The sum of this count for all the distinct sub-strings is the final answer.
Below is the implementation of the above approach:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
// Function to return the count of distinct // characters in all the distinct // sub-strings of the given string int countTotalDistinct(string str)
{ int cnt = 0;
// To store all the sub-strings
set<string> items;
for ( int i = 0; i < str.length(); ++i) {
// To store the current sub-string
string temp = "" ;
// To store the characters of the
// current sub-string
set< char > ans;
for ( int j = i; j < str.length(); ++j) {
temp = temp + str[j];
ans.insert(str[j]);
// If current sub-string hasn't
// been stored before
if (items.find(temp) == items.end()) {
// Insert it into the set
items.insert(temp);
// Update the count of
// distinct characters
cnt += ans.size();
}
}
}
return cnt;
} // Driver code int main()
{ string str = "ABCA" ;
cout << countTotalDistinct(str);
return 0;
} |
// Java implementation of the approach import java.util.HashSet;
class geeks
{ // Function to return the count of distinct
// characters in all the distinct
// sub-strings of the given string
public static int countTotalDistinct(String str)
{
int cnt = 0 ;
// To store all the sub-strings
HashSet<String> items = new HashSet<>();
for ( int i = 0 ; i < str.length(); ++i)
{
// To store the current sub-string
String temp = "" ;
// To store the characters of the
// current sub-string
HashSet<Character> ans = new HashSet<>();
for ( int j = i; j < str.length(); ++j)
{
temp = temp + str.charAt(j);
ans.add(str.charAt(j));
// If current sub-string hasn't
// been stored before
if (!items.contains(temp))
{
// Insert it into the set
items.add(temp);
// Update the count of
// distinct characters
cnt += ans.size();
}
}
}
return cnt;
}
// Driver code
public static void main(String[] args)
{
String str = "ABCA" ;
System.out.println(countTotalDistinct(str));
}
} // This code is contributed by // sanjeev2552 |
# Python3 implementation of the approach # Function to return the count of distinct # characters in all the distinct # sub-strings of the given string def countTotalDistinct(string) :
cnt = 0 ;
# To store all the sub-strings
items = set ();
for i in range ( len (string)) :
# To store the current sub-string
temp = "";
# To store the characters of the
# current sub-string
ans = set ();
for j in range (i, len (string)) :
temp = temp + string[j];
ans.add(string[j]);
# If current sub-string hasn't
# been stored before
if temp not in items :
# Insert it into the set
items.add(temp);
# Update the count of
# distinct characters
cnt + = len (ans);
return cnt;
# Driver code if __name__ = = "__main__" :
string = "ABCA" ;
print (countTotalDistinct(string));
# This code is contributed by AnkitRai01 |
// C# implementation of the approach using System;
using System.Collections.Generic;
class geeks
{ // Function to return the count of distinct
// characters in all the distinct
// sub-strings of the given string
public static int countTotalDistinct(String str)
{
int cnt = 0;
// To store all the sub-strings
HashSet<String> items = new HashSet<String>();
for ( int i = 0; i < str.Length; ++i)
{
// To store the current sub-string
String temp = "" ;
// To store the characters of the
// current sub-string
HashSet< char > ans = new HashSet< char >();
for ( int j = i; j < str.Length; ++j)
{
temp = temp + str[j];
ans.Add(str[j]);
// If current sub-string hasn't
// been stored before
if (!items.Contains(temp))
{
// Insert it into the set
items.Add(temp);
// Update the count of
// distinct characters
cnt += ans.Count;
}
}
}
return cnt;
}
// Driver code
public static void Main(String[] args)
{
String str = "ABCA" ;
Console.WriteLine(countTotalDistinct(str));
}
} // This code is contributed by 29AjayKumar |
<script> // js implementation of the approach // Function to return the count of distinct // characters in all the distinct // sub-strings of the given string function countTotalDistinct(str)
{ let cnt = 0;
// To store all the sub-strings
let items = new Set();
for (let i = 0; i < str.length; ++i) {
// To store the current sub-string
let temp = "" ;
// To store the characters of the
// current sub-string
let ans = new Set();
for (let j = i; j < str.length; ++j) {
temp = temp + str[j];
ans.add(str[j]);
// If current sub-string hasn't
// been stored before
if (!items.has(temp)) {
// Insert it into the set
items.add(temp);
// Update the count of
// distinct characters
cnt += ans.size;
}
}
}
return cnt;
} // Driver code let str = "ABCA" ;
document.write(countTotalDistinct(str)); </script> |
18
Time complexity: O(n^2)
As the nested loop is used the complexity is order if n^2
Space complexity: O(n)
two sets of size n are used so the complexity would be O(2n) nothing but O(n).