Rearrange the string to maximize the number of palindromic substrings
Last Updated :
05 Sep, 2022
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 newString
string 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 Code
int main()
{
string s = "aabab";
cout << newString(s);
return 0;
}
Java
// Java program to rearrange the
// string such to maximize the
// number of palindromic substrings
public 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 substrings
using System;
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[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 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>
Complexity Analysis:
- Time Complexity: O(N)
- Auxiliary Space: O(26)