Skip to content
Related Articles

Related Articles

Improve Article
Count number of Distinct Substring in a String
  • Difficulty Level : Medium
  • Last Updated : 07 Sep, 2020

Given a string, count all distinct substrings of the given string.

Examples:

Input : abcd
Output : abcd abc ab a bcd bc b cd c d
All Elements are Distinct

Input : aaa
Output : aaa aa a aa a a
All elements are not Distinct

Prerequisite : Print subarrays of a given array

The idea is to use hash table (HashSet in Java) to store all generated substrings. Finally we return size of the HashSet.

C++




// C++ program to count all distinct substrings in a string
#include<bits/stdc++.h>
using namespace std;
  
int distinctSubstring(string str)
{
    // Put all distinct substring in a HashSet
    set<string> result ;
  
    // List All Substrings
    for (int i = 0; i <= str.length(); i++)
    {
        for (int j = 1; j <= str.length()-i; j++)
        {
  
            // Add each substring in Set
            result.insert(str.substr(i, j));
        }
    }
  
    // Return size of the HashSet
    return result.size();
}
  
// Driver Code
int main()
{
    string str = "aaaa";
    cout << (distinctSubstring(str));
}
  
// This code is contributed by Rajput-Ji

Java




// Java program to count all distinct substrings in a string
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
  
public class DistinctSubstring {
  
    public static int distinctSubstring(String str)
    {
        // Put all distinct substring in a HashSet
        Set<String> result = new HashSet<String>();
  
        // List All Substrings
        for (int i = 0; i <= str.length(); i++) {
            for (int j = i + 1; j <= str.length(); j++) {
  
                // Add each substring in Set
                result.add(str.substring(i, j));
            }
        }
  
        // Return size of the HashSet
        return result.size();
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        String str = "aaaa";
        System.out.println(distinctSubstring(str));
    }
}

Python3




# Python3 program to count all distinct substrings in a string
  
def distinctSubstring(str):
    # Put all distinct substring in a HashSet
    result = set()
  
    # List All Substrings
    for i in range(len(str)+1):
        for j in range( i + 1, len(str)+1):
  
            # Add each substring in Set
            result.add(str[i:j]);
        # Return size of the HashSet
    return len(result);
  
# Driver Code
if __name__ == '__main__':
    str = "aaaa";
    print(distinctSubstring(str));
  
# This code has been contributed by 29AjayKumar

C#




// C# program to count all distinct
// substrings in a string
using System;
using System.Collections.Generic;
  
class DistinctSubstring 
{
    public static int distinctSubstring(String str)
    {
        // Put all distinct substring in a HashSet
        HashSet<String> result = new HashSet<String>();
  
        // List All Substrings
        for (int i = 0; i <= str.Length; i++) 
        {
            for (int j = i + 1; j <= str.Length; j++) 
            {
  
                // Add each substring in Set
                result.Add(str.Substring(i, j - i));
            }
        }
  
        // Return size of the HashSet
        return result.Count;
    }
  
    // Driver Code
    public static void Main(String[] args)
    {
        String str = "aaaa";
        Console.WriteLine(distinctSubstring(str));
    }
}
  
// This code is contributed by 29AjayKumar
Output:



4

How to print the distinct substrings?

C++




// C++ program to count all distinct
// substrings in a string
#include <bits/stdc++.h>
using namespace std;
  
set<string> distinctSubstring(string str)
{
  
    // Put all distinct substrings
    // in the Hashset
    set<string> result;
  
    // List all substrings
    for(int i = 0; i <= str.length(); i++)
    {
        for(int j = i + 1; j <= str.length(); j++)
        {
  
            // Add each substring in Set
            result.insert(str.substr(i, j));
        }
    }
  
    // Return the hashset
    return result;
}
  
// Driver code
int main()
{
    string str = "aaaa";
    set<string> subs = distinctSubstring(str);
  
    cout << "Distinct Substrings are: \n";
    for(auto i : subs)
        cout << i << endl;
}
  
// This code is contributed by Ronak Mangal

Java




// Java program to count all distinct substrings in a string
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
  
public class DistinctSubstring {
  
    public static Set<String> distinctSubstring(String str)
    {
  
        // Put all distinct substring in a HashSet
        Set<String> result = new HashSet<String>();
  
        // List All Substrings
        for (int i = 0; i <= str.length(); i++) {
            for (int j = i + 1; j <= str.length(); j++) {
  
                // Add each substring in Set
                result.add(str.substring(i, j));
            }
        }
  
        // Return the HashSet
        return result;
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        String str = "aaaa";
        Set<String> subs = distinctSubstring(str);
  
        System.out.println("Distinct Substrings are: ");
        for (String s : subs) {
            System.out.println(s);
        }
    }
}

Python3




# Python3 program to count all distinct 
# substrings in a string
  
def distinctSubstring(str):
  
    # Put all distinct substring in a HashSet
    result = set();
  
    # List All Substrings
    for i in range(len(str)):
        for j in range(i + 1, len(str) + 1):
  
            # Add each substring in Set
            result.add(str[i:j]);
  
        # Return the HashSet
    return result;
  
# Driver Code
if __name__ == '__main__':
  
    str = "aaaa";
    subs = distinctSubstring(str);
  
    print("Distinct Substrings are: ");
    for s in subs:
        print(s);
  
# This code is contributed by 29AjayKumar

C#




// C# program to count all distinct 
// substrings in a string
using System;
using System.Collections.Generic;
  
class GFG
{
    public static HashSet<String> distinctSubstring(String str)
    {
  
        // Put all distinct substring in a HashSet
        HashSet<String> result = new HashSet<String>();
  
        // List All Substrings
        for (int i = 0; i <= str.Length; i++) 
        {
            for (int j = i + 1; j <= str.Length; j++) 
            {
  
                // Add each substring in Set
                result.Add(str.Substring(i, j - i));
            }
        }
  
        // Return the HashSet
        return result;
    }
  
    // Driver Code
    public static void Main(String[] args)
    {
        String str = "aaaa";
        HashSet<String> subs = distinctSubstring(str);
  
        Console.WriteLine("Distinct Substrings are: ");
        foreach (String s in subs) 
        {
            Console.WriteLine(s);
        }
    }
}
  
// This code is contributed by 29AjayKumar
Output:
Distinct Substrings are: 
aa
aaa
a
aaaa

Optimization:
We can further optimize the above code. The substr() function works in linear time. We can use append current character to previous substring to get the current substring.

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the count of
// valid sub-strings
void printSubstrings(string s)
{
  
    // To store distinct output substrings
    unordered_set<string> us;
  
    // Traverse through the given string and
    // one by one generate substrings beginning
    // from s[i].
    for (int i = 0; i < s.size(); ++i) {
  
        // One by one generate substrings ending
        // with s[j]
        string ss = "";
        for (int j = i; j < s.size(); ++j) {
  
            ss = ss + s[j];
            us.insert(ss);
        }
    }
  
    // Print all substrings one by one
    for (auto s : us)
        cout << s << " ";
}
  
// Driver code
int main()
{
    string str = "aaabc";
    printSubstrings(str);
    return 0;
}

Java




// Java implementation of the approach
import java.util.*;
  
class GFG
{
  
// Function to return the count of
// valid sub-Strings
static void printSubStrings(String s)
{
  
    // To store distinct output subStrings
    HashSet<String> us = new HashSet<String>();
  
    // Traverse through the given String and
    // one by one generate subStrings beginning
    // from s[i].
    for (int i = 0; i < s.length(); ++i)
    {
  
        // One by one generate subStrings ending
        // with s[j]
        String ss = "";
        for (int j = i; j < s.length(); ++j) 
        {
            ss = ss + s.charAt(j);
            us.add(ss);
        }
    }
  
    // Print all subStrings one by one
    for (String str : us)
        System.out.print(str + " ");
}
  
// Driver code
public static void main(String[] args)
{
    String str = "aaabc";
    printSubStrings(str);
}
}
  
// This code is contributed by Rajput-Ji

Python3




# Python3 implementation of the approach
  
# Function to return the count of
# valid sub-Strings
def printSubStrings(s):
  
    # To store distinct output subStrings
    us = set();
  
    # Traverse through the given String and
    # one by one generate subStrings beginning
    # from s[i].
    for i in range(len(s)):
  
        # One by one generate subStrings ending
        # with s[j]
        ss = "";
        for j in range(i, len(s)):
            ss = ss + s[j];
            us.add(ss);
          
    # Prall subStrings one by one
    for str in us:
        print(str, end=" ");
  
# Driver code
if __name__ == '__main__':
    str = "aaabc";
    printSubStrings(str);
      
# This code is contributed by 29AjayKumar

C#




// C# implementation of the approach
using System;
using System.Collections.Generic;
  
class GFG
{
  
// Function to return the count of
// valid sub-Strings
static void printSubStrings(String s)
{
  
    // To store distinct output subStrings
    HashSet<String> us = new HashSet<String>();
  
    // Traverse through the given String and
    // one by one generate subStrings 
    // beginning from s[i].
    for (int i = 0; i < s.Length; ++i)
    {
  
        // One by one generate subStrings
        // ending with s[j]
        String ss = "";
        for (int j = i; j < s.Length; ++j) 
        {
            ss = ss + s[j];
            us.Add(ss);
        }
    }
  
    // Print all subStrings one by one
    foreach (String str in us)
        Console.Write(str + " ");
}
  
// Driver code
public static void Main(String[] args)
{
    String str = "aaabc";
    printSubStrings(str);
}
}
  
// This code is contributed by Rajput-Ji
Output:
bc b abc ab aabc aa aaa c a aaab aab aaabc

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer DSA Live Classes 




My Personal Notes arrow_drop_up
Recommended Articles
Page :