Find distinct characters in distinct substrings of a string

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:

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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
chevron_right

Output:
18

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.





Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :
Practice Tags :