Count substrings with same first and last characters - GeeksforGeeks

22 Oct, 2021
We are given a string S, we need to find count of all contiguous substrings starting and ending with same character.
Examples : 
Input  : S = "abcab"
Output : 7
There are 15 substrings of "abcab"
a, ab, abc, abca, abcab, b, bc, bca
bcab, c, ca, cab, a, ab, b
Out of the above substrings, there 
are 7 substrings : a, abca, b, bcab, 
c, a and b.

Input  : S = "aba"
Output : 4
The substrings are a, b, a and aba
Method 1 (Simple): In this approach, we use brute force and find all the sub-strings and pass them through our function checkEquality to see if starting and ending characters are same.
C++
Java
Python3
C#
PHP
Javascript
// C++ program to count all substrings with same// first and last characters.#include <bits/stdc++.h>using namespace std; // Returns true if first and last characters// of s are same.int checkEquality(string s){    return (s[0] == s[s.size() - 1]);} int countSubstringWithEqualEnds(string s){    int result = 0;    int n = s.length();     // Starting point of substring    for (int i = 0; i < n; i++)        // Length of substring       for (int len = 1; len <= n-i; len++)           // Check if current substring has same          // starting and ending characters.          if (checkEquality(s.substr(i, len)))            result++;     return result;} // Driver functionint main(){    string s("abcab");    cout << countSubstringWithEqualEnds(s);    return 0;}
// Java program to count all substrings with same// first and last characters.public class GFG {      // Returns true if first and last characters    // of s are same.    static boolean checkEquality(String s)    {        return (s.charAt(0) == s.charAt(s.length() - 1));    }          static int countSubstringWithEqualEnds(String s)    {        int result = 0;        int n = s.length();              // Starting point of substring        for (int i = 0; i < n; i++)                 // Length of substring           for (int len = 1; len <= n-i; len++)                    // Check if current substring has same              // starting and ending characters.              if (checkEquality(s.substring(i, i + len)))                result++;              return result;    }          // Driver function    public static void main(String args[])    {        String s = "abcab";        System.out.println(countSubstringWithEqualEnds(s));    }}// This code is contributed by Sumit Ghosh
     # Python program to count all substrings with same# first and last characters. # Returns true if first and last characters# of s are same.def checkEquality(s):    return (ord(s[0]) == ord(s[len(s) - 1])); def countSubstringWithEqualEnds(s):    result = 0;    n = len(s);     # Starting point of substring    for i in range(n):     # Length of substring        for j in range(1,n-i+1):         # Check if current substring has same        # starting and ending characters.            if (checkEquality(s[i:i+j])):                result+=1;     return result; # Driver codes = "abcab";print(countSubstringWithEqualEnds(s)); # This code contributed by PrinciRaj1992
// C# program to count all// substrings with same// first and last characters.using System; class GFG{     // Returns true if first and    //  last characters of s are same.    static bool checkEquality(string s)    {        return (s[0] == s[s.Length - 1]);    }         static int countSubstringWithEqualEnds(string s)    {        int result = 0;        int n = s.Length;             // Starting point of substring        for (int i = 0; i < n; i++)             // Length of substring        for (int len = 1; len <= n-i; len++)                 // Check if current substring has same            // starting and ending characters.            if (checkEquality(s.Substring(i, len)))                result++;             return result;    }         // Driver code    public static void Main()    {        string s = "abcab";        Console.WriteLine(countSubstringWithEqualEnds(s));    }} // This code is contributed by Code_Mech
<?php// PHP program to count all substrings// with same first and last characters. // Returns true if first and last// characters of s are same.function checkEquality($s){    return ($s[0] == $s[strlen($s) - 1]);} function countSubstringWithEqualEnds($s){    $result = 0;    $n = strlen($s);     // Starting point of substring    for ($i = 0; $i < $n; $i++)     // Length of substring    for ($len = 1; $len <= $n - $i; $len++)         // Check if current substring has same        // starting and ending characters.        if (checkEquality(substr($s, $i, $len)))            $result++;     return $result;} // Driver Code$s = "abcab";print(countSubstringWithEqualEnds($s)); // This code is contributed by chandan_jnu?>
<script> // JavaScript program to count all substrings// with same first and last characters.   // Returns true if first and last characters// of s are same.function checkEquality(s){    return (s.charAt(0) == s.charAt(s.length - 1));}  function countSubstringWithEqualEnds(s){    var result = 0;    var n = s.length;      // Starting point of substring    for (var i = 0; i < n; i++)         // Length of substring       for (var len = 1; len <= n-i; len++)            // Check if current substring has same          // starting and ending characters.          if (checkEquality(s.substring(i, i + len)))            result++;      return result;}  // Driver function     var s = "abcab";    document.write(countSubstringWithEqualEnds(s));  // This code contributed by shikhasingrajput </script>
Output: 
7
Although the above code works fine, it’s not efficient as its time complexity is O(n2). Note that there are n*(n+1)/2 substrings of a string of length n. This solution also requires O(n) extra space as we one by one create all substrings.  Method 2 (Space Efficient): In this approach we don’t actually generate substrings rather we traverse the string in such a manner so that we can easily compare first and last characters. 
C++
Java
Python3
C#
PHP
Javascript
// Space efficient C++ program to count all// substrings with same first and last characters.#include <bits/stdc++.h>using namespace std; int countSubstringWithEqualEnds(string s){    int result = 0;    int n = s.length();     // Iterating through all substrings in    // way so that we can find first and last    // character easily    for (int i=0; i<n; i++)        for (int j=i; j<n; j++)            if (s[i] == s[j])                result++;     return result;} // Driver functionint main(){    string s("abcab");    cout << countSubstringWithEqualEnds(s);    return 0;}
// Space efficient Java program to count all// substrings with same first and last characters.public class GFG {       static int countSubstringWithEqualEnds(String s)    {        int result = 0;        int n = s.length();              // Iterating through all substrings in        // way so that we can find first and last        // character easily        for (int i = 0; i < n; i++)            for (int j = i; j < n; j++)                if (s.charAt(i) == s.charAt(j))                    result++;              return result;    }          // Driver function    public static void main(String args[])    {        String s = "abcab";        System.out.println(countSubstringWithEqualEnds(s));    }}// This code is contributed by Sumit Ghosh
# Space efficient Python3 program to count all# substrings with same first and last characters.def countSubstringWithEqualEnds(s):     result = 0;    n = len(s);     # Iterating through all substrings in    # way so that we can find first and    # last character easily    for i in range(n):        for j in range(i, n):            if (s[i] == s[j]):                result = result + 1     return result # Driver Codes = "abcab";print(countSubstringWithEqualEnds(s)) # This code is contributed# by Akanksha Rai
// Space efficient C# program to count all// substrings with same first and last characters.using System; public class GFG {        static int countSubstringWithEqualEnds(string s)    {        int result = 0;        int n = s.Length;               // Iterating through all substrings in        // way so that we can find first and last        // character easily        for (int i = 0; i < n; i++)            for (int j = i; j < n; j++)                if (s[i] == s[j])                    result++;               return result;    }           // Driver function    public static void Main()    {        string s = "abcab";        Console.Write(countSubstringWithEqualEnds(s));    }} // This code is contributed by nitin mittal
<?php// Space efficient PHP program to count all// substrings with same first and last characters. function countSubstringWithEqualEnds($s){    $result = 0;    $n = strlen($s);     // Iterating through all substrings in    // way so that we can find first and last    // character easily    for ($i = 0; $i < $n; $i++)        for ($j = $i; $j < $n; $j++)            if ($s[$i] == $s[$j])                $result++;     return $result;} // Driver Code$s = "abcab";echo countSubstringWithEqualEnds($s); // This code is contributed// by Akanksha Rai
<script> // Space efficient javascript program to count all// substrings with same first and last characters.function countSubstringWithEqualEnds(s){    var result = 0;    var n = s.length;      // Iterating through all substrings in    // way so that we can find first and last    // character easily    for(i = 0; i < n; i++)        for(j = i; j < n; j++)            if (s.charAt(i) == s.charAt(j))                result++;      return result;}  // Driver codevar s = "abcab";document.write(countSubstringWithEqualEnds(s)); // This code is contributed by Princi Singh </script>
Output:
7
In the above code although we have reduced the extra space to O(1) time complexity is still O(n^2). Method 3 (Best approach) : Now if we carefully observe then we can realize that the answer just depends on frequencies of characters in the original string. For example in string abcab, frequency of ‘a’ is 2, and substrings contributing to answering are a, abca and a respectively, a total of 3, which is calculated by (frequency of ‘a’+1)C2. 
C++
Java
Python3
C#
PHP
Javascript
// Most efficient C++ program to count all // substrings with same first and last characters.#include <bits/stdc++.h>using namespace std;const int MAX_CHAR = 26;  // assuming lower case only int countSubstringWithEqualEnds(string s){    int result = 0;    int n = s.length();     // Calculating frequency of each character    // in the string.    int count[MAX_CHAR] = {0};    for (int i=0; i<n; i++)        count[s[i]-'a']++;     // Computing result using counts    for (int i=0; i<MAX_CHAR; i++)        result += (count[i]*(count[i]+1)/2);     return result;} // Driver functionint main(){    string s("abcab");    cout << countSubstringWithEqualEnds(s);    return 0;}
// Most efficient Java program to count all // substrings with same first and last characters.public class GFG {               // assuming lower case only    static final int MAX_CHAR = 26;           static int countSubstringWithEqualEnds(String s)    {        int result = 0;        int n = s.length();              // Calculating frequency of each character        // in the string.        int[] count =  new int[MAX_CHAR];        for (int i = 0; i < n; i++)            count[s.charAt(i)-'a']++;              // Computing result using counts        for (int i = 0; i < MAX_CHAR; i++)            result += (count[i] * (count[i] + 1) / 2);              return result;    }          // Driver function    public static void main(String args[])    {        String s = "abcab";        System.out.println(countSubstringWithEqualEnds(s));    }}// This code is contributed by Sumit Ghosh
# Most efficient Python program to count all# substrings with same first and last characters. MAX_CHAR = 26; # assuming lower case only def countSubstringWithEqualEnds(s):    result = 0;    n = len(s);     # Calculating frequency of each character    # in the string.    count = [0]*MAX_CHAR;    for i in range(n):        count[ord(s[i])-ord('a')]+=1;     # Computing result using counts    for i in range(MAX_CHAR):        result += (count[i]*(count[i]+1)/2);     return result; # Driver codes = "abcab";print(countSubstringWithEqualEnds(s));  # This code is contributed by 29AjayKumar
// Most efficient C# program to count all// substrings with same first and last characters.using System;     class GFG {             // assuming lower case only    static readonly int MAX_CHAR = 26;         static int countSubstringWithEqualEnds(String s)    {        int result = 0;        int n = s.Length;             // Calculating frequency of each character        // in the string.        int[] count = new int[MAX_CHAR];        for (int i = 0; i < n; i++)            count[s[i] - 'a']++;             // Computing result using counts        for (int i = 0; i < MAX_CHAR; i++)            result += (count[i] * (count[i] + 1) / 2);             return result;    }         // Driver code    public static void Main()    {        String s = "abcab";        Console.Write(countSubstringWithEqualEnds(s));    }} // This code is contributed by 29AjayKumar
<?php// Most efficient PHP program to count all// substrings with same first and last characters.$MAX_CHAR = 26; // assuming lower case only function countSubstringWithEqualEnds($s){    global $MAX_CHAR;    $result = 0;    $n = strlen($s);     // Calculating frequency of each    // character in the string.    $count = array_fill(0, $MAX_CHAR, 0);    for ($i = 0; $i < $n; $i++)        $count[ord($s[$i]) - ord('a')]++;     // Computing result using counts    for ($i = 0; $i < $MAX_CHAR; $i++)        $result += ($count[$i] *                   ($count[$i] + 1) / 2);     return $result;} // Driver Code$s = "abcab";echo countSubstringWithEqualEnds($s); // This code is contributed by mits?>
<script>// Most efficient javascript program to count all // substrings with same first and last characters.       // assuming lower case only    var MAX_CHAR = 26;           function countSubstringWithEqualEnds(s)    {        var result = 0;        var n = s.length;              // Calculating frequency of each character        // in the string.        var count =  Array.from({length: MAX_CHAR}, (_, i) => 0);        for (var i = 0; i < n; i++)            count[s.charAt(i).charCodeAt(0)-'a'.charCodeAt(0)]++;              // Computing result using counts        for (var i = 0; i < MAX_CHAR; i++)            result += (count[i] * (count[i] + 1) / 2);              return result;    }          // Driver function    var s = "abcab";    document.write(countSubstringWithEqualEnds(s)); // This code is contributed by 29AjayKumar</script>
Output:
7
The above code has time complexity of O(n) and requires O(1) extra space.Recursive solution to count substrings with same first and last charactersThis article is contributed by Aditya Gupta. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.. 
nitin mittal
29AjayKumar
Mithun Kumar
Akanksha_Rai
Chandan_Kumar
Code_Mech
princiraj1992
princi singh
shikhasingrajput
anikaseth98
arorakashish0911
Amazon
Mathematical
Strings
Technical Scripter
Amazon
Strings
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Program to find GCD or HCF of two numbers
Sieve of Eratosthenes
Write a program to reverse an array or string
Reverse a string in Java
Longest Common Subsequence | DP-4
Check for Balanced Brackets in an expression (well-formedness) using Stack
Python program to check if a string is palindrome or not