# Count substrings with same first and last characters

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.

**Implementation:**

## C++

`// 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 function` `int` `main()` `{` ` ` `string s(` `"abcab"` `);` ` ` `cout << countSubstringWithEqualEnds(s);` ` ` `return` `0;` `}` |

## Java

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

## Python3

` ` `# 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 code` `s ` `=` `"abcab"` `;` `print` `(countSubstringWithEqualEnds(s));` `# This code contributed by PrinciRaj1992` |

## C#

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

## Javascript

`<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(n^{2}). 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.

**Implementation:**

## C++

`// 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 function` `int` `main()` `{` ` ` `string s(` `"abcab"` `);` ` ` `cout << countSubstringWithEqualEnds(s);` ` ` `return` `0;` `}` |

## Java

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

## Python3

`# 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 Code` `s ` `=` `"abcab"` `;` `print` `(countSubstringWithEqualEnds(s))` `# This code is contributed ` `# by Akanksha Rai` |

## C#

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

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

## Javascript

`<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 code` `var` `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)}C_{2}.

**Implementation:**

## C++

`// 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 function` `int` `main()` `{` ` ` `string s(` `"abcab"` `);` ` ` `cout << countSubstringWithEqualEnds(s);` ` ` `return` `0;` `}` |

## Java

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

## Python3

`# 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 code` `s ` `=` `"abcab"` `;` `print` `(countSubstringWithEqualEnds(s));` `# This code is contributed by 29AjayKumar` |

## C#

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

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

## Javascript

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

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