Open In App
Related Articles

Find distinct characters in distinct substrings of a string

Improve Article
Improve
Save Article
Save
Like Article
Like

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++




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




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




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




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


Javascript




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


Output: 

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).


Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!

Last Updated : 07 Sep, 2021
Like Article
Save Article
Previous
Next
Similar Reads
Complete Tutorials