Rearrange the string to maximize the number of palindromic substrings

Given a string S consisting of lowercase characters(a-z) only, the task is to print a new string by rearranging the string in such a way that maximizes the number of palindromic substrings. In case of multiple answers, print any one.
Note: even if some substrings coincide, count them as many times as they appear in the obtained string.
Examples:
Input: s = “aabab”
Output: ababa
string “ababa” has 9 palindromic substrings: “a”, “b”, “a”, “b”, “a”, “aba”, “bab”, “aba”, “ababa”.Input: s = “aa”
Output: aa
The given string has the maximum number of palindromic substrings possible, “a”, “a” and “aa”.
The problem might look to be a complex one but on solving for various cases and having observations will lead to an easy solution.
A simple solution is to sort the string and print it. Sorting takes O(N * log N). An efficient solution is to count the frequency of each character using a freq[] array and then construct the string using the freq[] array.
Below is the implementation of the above approach.
C++
// C++ program to rearrange the// string such to maximize the// number of palindromic substrings#include <bits/stdc++.h>using namespace std;// Function to return the newStringstring newString(string s){ // length of string int l = s.length(); // hashing array int freq[26] = { 0 }; // iterate and count for (int i = 0; i < l; i++) { freq[s[i] - 'a'] += 1; } // resulting string string ans = ""; // form the resulting string for (int i = 0; i < 26; i++) { // number of times character appears for (int j = 0; j < freq[i]; j++) { // append to resulting string ans += (char)(97 + i); } } return ans;}// Driver Codeint main(){ string s = "aabab"; cout << newString(s); return 0;} |
Java
// Java program to rearrange the// string such to maximize the// number of palindromic substringspublic class GFG { // Function to return the newString static String newString(String s) { // length of string int l = s.length(); // hashing array int freq[] = new int [26] ; // iterate and count for (int i = 0; i < l; i++) { freq[s.charAt(i) - 'a'] += 1; } // resulting string String ans = ""; // form the resulting string for (int i = 0; i < 26; i++) { // number of times character appears for (int j = 0; j < freq[i]; j++) { // append to resulting string ans += (char)(97 + i); } } return ans; } // Driver code public static void main(String args[]) { String s = "aabab"; System.out.println(newString(s)); } // This Code is contributed by ANKITRAI1} |
Python3
# Python3 program to rearrange the # string such to maximize the # number of palindromic substrings # Function to return the newString def newString(s): # length of string l = len(s) # hashing array freq = [0] * (26) # iterate and count for i in range(0, l): freq[ord(s[i]) - ord('a')] += 1 # resulting string ans = "" # form the resulting string for i in range(0, 26): # number of times character appears for j in range(0, freq[i]): # append to resulting string ans += chr(97 + i) return ans # Driver Code if __name__ == "__main__": s = "aabab" print(newString(s))# This code is contributed by Rituraj Jain |
C#
// C# program to rearrange the// string such to maximize the// number of palindromic substringsusing System;class GFG{// Function to return the newStringstatic String newString(string s){ // length of string int l = s.Length; // hashing array int[] freq = new int [26]; // iterate and count for (int i = 0; i < l; i++) { freq[s[i] - 'a'] += 1; } // resulting string string ans = ""; // form the resulting string for (int i = 0; i < 26; i++) { // number of times character appears for (int j = 0; j < freq[i]; j++) { // append to resulting string ans += (char)(97 + i); } } return ans;}// Driver codepublic static void Main(){ string s = "aabab"; Console.Write(newString(s));}}// This code is contributed // by ChitraNayal |
Javascript
<script> // Javascript program to rearrange the // string such to maximize the // number of palindromic substrings // Function to return the newString function newString(s) { // length of string let l = s.length; // hashing array let freq = new Array(26); freq.fill(0); // iterate and count for (let i = 0; i < l; i++) { freq[s[i].charCodeAt(0) - 'a'.charCodeAt(0)] += 1; } // resulting string let ans = ""; // form the resulting string for (let i = 0; i < 26; i++) { // number of times character appears for (let j = 0; j < freq[i]; j++) { // append to resulting string ans += String.fromCharCode(97 + i); } } return ans; } let s = "aabab"; document.write(newString(s)); // This code is contributed by divyeshrabadiya07.</script> |
aaabb
Complexity Analysis:
- Time Complexity: O(N)
- Auxiliary Space: O(26)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



