Open In App

Find distinct characters in distinct substrings of a string

Last Updated : 07 Sep, 2021
Comments
Improve
Suggest changes
Like Article
Like
Report

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-stringsDistinct characters
A1
AB2
ABC3
ABCA3
B1
BC2
BCA3
C1
CA2


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


Next Article

Similar Reads