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:

C++

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


Java

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


Python3

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


C#

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


My Personal Notes arrow_drop_up

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.