# Count All Palindrome Sub-Strings in a String | Set 2

• Difficulty Level : Medium
• Last Updated : 04 Jan, 2022

Given a string, the task is to count all palindrome substring in a given string. Length of palindrome substring is greater then or equal to 2.

```Examples:
Input : str = "abaab"
Output: 3
Explanation :
All palindrome substring are :
"aba", "aa", "baab"

Input : str = "abbaeae"
Output: 4
Explanation :
All palindrome substring are :
"bb", "abba", "aea", "eae":
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

We have discussed a dynamic programming based solution in below post.

Count All Palindrome Sub-Strings in a String | Set 1

The solution discussed here is extension of Longest Palindromic Substring problem. The idea is for each character in the given input string, we consider it as midpoint of a palindrome and expand it in both directions to find all palindromes of even and odd lengths. We use hashmap to keep track of all the distinct palindromes of length greater than 1 and return map size which have count of all possible palindrome substrings.

The C++ implementation is given below.

## CPP

 `// C++ program to count all distinct palindromic ` `// substrings of a string. ` `#include ` `using` `namespace` `std; ` ` `  `// Returns total number of palindrome substring of ` `// length greater than equal to 2 ` `int` `countPalindromes(string s) ` `{ ` `    ``unordered_map m; ` `    ``for` `(``int` `i = 0; i < s.length(); i++) { ` ` `  `        ``// check for odd length palindromes ` `        ``for` `(``int` `j = 0; j <= i; j++) { ` ` `  `            ``if` `(!s[i + j]) ` `                ``break``; ` ` `  `            ``if` `(s[i - j] == s[i + j]) { ` ` `  `                ``// check for palindromes of length ` `                ``// greater than 1 ` `                ``if` `((i + j + 1) - (i - j) > 1) ` `                    ``m[s.substr(i - j,  ` `                        ``(i + j + 1) - (i - j))]++; ` ` `  `            ``} ``else` `                ``break``; ` `        ``} ` ` `  `        ``// check for even length palindromes ` `        ``for` `(``int` `j = 0; j <= i; j++) { ` `            ``if` `(!s[i + j + 1]) ` `                ``break``; ` `            ``if` `(s[i - j] == s[i + j + 1]) { ` ` `  `                ``// check for palindromes of length  ` `                ``// greater than 1 ` `                ``if` `((i + j + 2) - (i - j) > 1) ` `                    ``m[s.substr(i - j,  ` `                         ``(i + j + 2) - (i - j))]++; ` ` `  `            ``} ``else` `                ``break``; ` `        ``} ` `    ``} ` `    ``return` `m.size(); ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``string s = ``"abbaeae"``; ` `    ``cout << countPalindromes(s) << endl; ` `    ``return` `0; ` `} `

Output:

```4
```

Time complexity O(n2)
Auxiliary Space O(n)

We can easily extend this solution to print all palindromic substrings also. We need to simply traverse the map m and print its content.

Another Approach is to use Java String Class, to do so,

1. Iterate the loop twice for substring, get the substring of a string using `substring()` method.
2. Reverse the substring using StringBuffer Class method `reverse() `
3. Check for palindrome with substring and reverse substring
4. If it is palindrome increment the count and return the count at last

## Java

 `// Java Program to count palindrome substring ` `// in a string ` `public` `class` `PalindromeSubstring { ` `     `  `    ``// Method which return count palindrome substring ` `    ``static` `int` `countPS(String str){ ` `        ``String temp = ``""``; ` `        ``StringBuffer stf; ` `        ``int` `count = ``0``; ` `        ``// Iterate the loop twice ` `        ``for` `(``int` `i = ``0``; i < str.length(); i++) { ` `            ``for` `(``int` `j = i + ``1``; j <= str.length(); j++) { ` `                ``// Get each substring ` `                ``temp = str.substring(i, j); ` `                 `  `                ``// If length is greater than or equal to two ` `                ``// Check for palindrome     ` `                ``if` `(temp.length() >= ``2``) { ` `                    ``// Use StringBuffer class to reverse the string ` `                    ``stf = ``new` `StringBuffer(temp); ` `                    ``stf.reverse(); ` `                    ``// Compare substring with reverse of substring ` `                    ``if` `(stf.toString().compareTo(temp) == ``0``) ` `                        ``count++; ` `                ``} ` `            ``} ` `        ``} ` `        ``// return the count ` `        ``return` `count; ` `    ``} ` `     `  `    ``// Driver Code ` `    ``public` `static` `void` `main(String args[]) ``throws` `Exception { ` `        ``// Declare and initialize the string ` `        ``String str = ``"abbaeae"``; ` `        ``// Call the method ` `        ``System.out.println(countPS(str)); ` `    ``} ` `} ``// This code is contributes by hungundji `

## C#

 `// C# Program to count palindrome substring ` `// in a string  ` `using` `System; ` ` `  `class` `GFG ` `{ ` `     `  `    ``// Method which return count palindrome substring ` `    ``static` `int` `countPS(String str) ` `    ``{ ` `        ``String temp = ``""``; ` `        ``String stf; ` `        ``int` `count = 0; ` `         `  `        ``// Iterate the loop twice ` `        ``for` `(``int` `i = 0; i < str.Length; i++)  ` `        ``{ ` `            ``for` `(``int` `j = i + 1;  ` `                     ``j <= str.Length; j++) ` `            ``{ ` `                ``// Get each substring ` `                ``temp = str.Substring(i, j-i); ` `                 `  `                ``// If length is greater than or equal to two ` `                ``// Check for palindrome  ` `                ``if` `(temp.Length >= 2) ` `                ``{ ` `                    ``// Use StringBuffer class to reverse  ` `                    ``// the string ` `                    ``stf = temp; ` `                    ``stf = reverse(temp); ` `                     `  `                    ``// Compare substring with reverse of substring ` `                    ``if` `(stf.ToString().CompareTo(temp) == 0) ` `                        ``count++; ` `                ``} ` `            ``} ` `        ``} ` `         `  `        ``// return the count ` `        ``return` `count; ` `    ``} ` `     `  `    ``static` `String reverse(String input)  ` `    ``{ ` `        ``char``[] a = input.ToCharArray(); ` `        ``int` `l, r = 0; ` `        ``r = a.Length - 1; ` ` `  `        ``for` `(l = 0; l < r; l++, r--) ` `        ``{ ` `            ``// Swap values of l and r  ` `            ``char` `temp = a[l]; ` `            ``a[l] = a[r]; ` `            ``a[r] = temp; ` `        ``} ` `        ``return` `String.Join(``""``,a); ` `    ``} ` `     `  `    ``// Driver Code ` `    ``public` `static` `void` `Main(String []args) ` `    ``{ ` `        ``// Declare and initialize the string ` `        ``String str = ``"abbaeae"``; ` `         `  `        ``// Call the method ` `        ``Console.WriteLine(countPS(str)); ` `    ``} ` `}  ` ` `  `// This code is contributed by Rajput-Ji `

Output:

`4`

Time complexity O(n2)
Auxiliary Space O(n)

This article is contributed by Ankur Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.