Given string str consisting of lowercase English alphabets, the task is to find the total number of palindromic sub-strings present in the sorted form of str.
Examples:
Input: str = “acbbd”
Output: 6
All palindromic sub-string in it’s sorted form (“abbcd”) are “a”, “b”, “b”, “bb”, “c” and “d”.Input: str = “abbabdbd”
Output: 16
Naive approach: One way is to sort the given string and then count the total number of sub-strings present which are palindromes. For finding a number of palindromic sub-strings this approach can be used which has a time complexity of O(n^2).
Optimized approach: An efficient way is to count the frequency of each character and then for each frequency total number of palindromes will (n*(n+1))/2 as all the palindromic sub-strings of a sorted string will consist of the same character.
For example, palindromic sub-string for the string “aabbbcd” will be “a”, “aa”, …, “bbb”, “c”, … etc. Time complexity for this approach will be O(n).
- Create a hash table for storing the frequencies of each character of the string str.
- Traverse the hash table and for each non-zero frequency add (hash[i] * (hash[i]+1)) / 2 to the sum.
- Print the sum in the end.
Below is the implementation of the above approach:
C++
// CPP program to find the count of palindromic sub-string// of a string in it's ascending form#include <bits/stdc++.h>using namespace std;const int MAX_CHAR = 26;// function to return count of palindromic sub-stringint countPalindrome(string str){ int n = str.size(); int sum = 0; // calculate frequency int hashTable[MAX_CHAR]; for (int i = 0; i < n; i++) hashTable[str[i] - 'a']++; // calculate count of palindromic sub-string for (int i = 0; i < 26; i++) { if (hashTable[i]) sum += (hashTable[i] * (hashTable[i] + 1) / 2); } // return result return sum;}// driver programint main(){ string str = "ananananddd"; cout << countPalindrome(str); return 0;} |
Java
// Java program to find the count of palindromic sub-string // of a string in it's ascending form class GFG { final static int MAX_CHAR = 26;// function to return count of palindromic sub-string static int countPalindrome(String str) { int n = str.length(); int sum = 0; // calculate frequency int hashTable[] = new int[MAX_CHAR]; for (int i = 0; i < n; i++) { hashTable[str.charAt(i) - 'a']++; } // calculate count of palindromic sub-string for (int i = 0; i < 26; i++) { if (hashTable[i] != 0) { sum += (hashTable[i] * (hashTable[i] + 1) / 2); } } // return result return sum; }// driver program public static void main(String[] args) { String str = "ananananddd"; System.out.println(countPalindrome(str)); }} |
Python3
# Python3 program to find the count of # palindromic sub-string of a string # in it's ascending formMAX_CHAR = 26# function to return count of # palindromic sub-stringdef countPalindrome(str): n = len (str) sum = 0 # calculate frequency hashTable = [0] * MAX_CHAR for i in range(n): hashTable[ord(str[i]) - ord('a')] += 1 # calculate count of palindromic # sub-string for i in range(26) : if (hashTable[i]): sum += (hashTable[i] * (hashTable[i] + 1) // 2) # return result return sum# Driver Codeif __name__ == "__main__": str = "ananananddd" print (countPalindrome(str))# This code is contributed by ita_c |
C#
// C# program to find the count of palindromic sub-string // of a string in it's ascending form using System; public class GFG{ readonly static int MAX_CHAR = 26; // function to return count of palindromic sub-string static int countPalindrome(String str) { int n = str.Length; int sum = 0; // calculate frequency int []hashTable = new int[MAX_CHAR]; for (int i = 0; i < n; i++) { hashTable[str[i] - 'a']++; } // calculate count of palindromic sub-string for (int i = 0; i < 26; i++) { if (hashTable[i] != 0) { sum += (hashTable[i] * (hashTable[i] + 1) / 2); } } // return result return sum; } // driver program public static void Main() { String str = "ananananddd"; Console.Write(countPalindrome(str)); }}// This code is contributed by Rajput-Ji |
PHP
<?php// PHP program to find the count of // palindromic sub-string of a string// in it's ascending form$MAX_CHAR = 26;// function to return count of // palindromic sub-stringfunction countPalindrome($str){ global $MAX_CHAR; $n = strlen($str); $sum = 0; // calculate frequency $hashTable = array_fill(0, $MAX_CHAR, 0); for ($i = 0; $i < $n; $i++) $hashTable[ord($str[$i]) - ord('a')]++; // calculate count of palindromic sub-string for ($i = 0; $i < 26; $i++) { if ($hashTable[$i]) $sum += (int)($hashTable[$i] * ($hashTable[$i] + 1) / 2); } // return result return $sum;}// Driver Code$str = "ananananddd";echo countPalindrome($str);// This code is contributed by mits?> |
Javascript
<script>// Javascript program to find the count of palindromic sub-string// of a string in it's ascending formvar MAX_CHAR = 26;// function to return count of palindromic sub-stringfunction countPalindrome(str){ var n = str.length; var sum = 0; // calculate frequency var hashTable = Array(MAX_CHAR).fill(0); for (var i = 0; i < n; i++) hashTable[str[i].charCodeAt(0) - 'a'.charCodeAt(0)]++; // calculate count of palindromic sub-string for (var i = 0; i < 26; i++) { if (hashTable[i]) sum += (hashTable[i] * (hashTable[i] + 1) / 2); } // return result return sum;}// driver programvar str = "ananananddd";document.write( countPalindrome(str));</script> |
32626385
Complexity Analysis:
- Time Complexity: O(N), as we are using a loop to traverse N times. Where N is the length of the string.
- Auxiliary Space: O(26), as we are using extra space for the hash table.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
