# Count of Palindromic Strings possible by swapping of a pair of Characters

Last Updated : 11 May, 2021

Given a palindromic string S, the task is to find the count of palindromic strings possible by swapping a pair of character at a time.
Examples:

Input: s = “abba”
Output:
Explanation:
1st Swap: abba -> abba
2nd Swap: abba -> abb
All other swaps will lead to a non-palindromic string.
Therefore, the count of possible strings is 2.
Input: s = “aaabaaa”
Output: 15

Naive Approach:
The simplest approach to solve the problem is to generate all possible pair of characters from the given string and for each pair if swapping them generates a palindromic string or not. If found to be true, increase count. Finally, print the value of count
Time Complexity: O(N3
Auxiliary Space: O(1)
Efficient Approach:
To optimize the above-mentioned approach, calculate the frequencies of each character in the string. For the string to remain a palindrome, only the same character can be swapped in the string.
Follow the steps below to solve the problem:

• Traverse the string.
• For every ith character, increase count with the current frequency of the character. This increases the number of swaps the current character can make with its previous occurrences.
• Increase the frequency of the ith character.
• Finally, after complete traversal of the string, print count.

Below is the implementation of above approach:

## C++

 // C++ Program to implement // the above approach #include using namespace std;   // Function to return the count of // possible palindromic strings long long findNewString(string s) {       long long ans = 0;       // Stores the frequencies     // of each character     int freq[26];       // Stores the length of     // the string     int n = s.length();       // Initialize frequencies     memset(freq, 0, sizeof freq);       for (int i = 0; i < (int)s.length(); ++i) {           // Increase the number of swaps,         // the current character make with         // its previous occurrences         ans += freq[s[i] - 'a'];           // Increase frequency         freq[s[i] - 'a']++;     }       return ans; }   // Driver Code int main() {     string s = "aaabaaa";     cout << findNewString(s) << '\n';       return 0; }

## Java

 // Java Program to implement // the above approach import java.util.*; class GFG{   // Function to return the count of // possible palindromic Strings static long findNewString(String s) {     long ans = 0;       // Stores the frequencies     // of each character     int []freq = new int[26];       // Stores the length of     // the String     int n = s.length();       // Initialize frequencies     Arrays.fill(freq, 0);       for (int i = 0; i < (int)s.length(); ++i)     {           // Increase the number of swaps,         // the current character make with         // its previous occurrences         ans += freq[s.charAt(i) - 'a'];           // Increase frequency         freq[s.charAt(i) - 'a']++;     }     return ans; }   // Driver Code public static void main(String[] args) {     String s = "aaabaaa";     System.out.print(findNewString(s)); } }   // This code is contributed by sapnasingh4991

## Python3

 # Python3 program to implement # the above approach   # Function to return the count of # possible palindromic strings def findNewString(s):       ans = 0       # Stores the frequencies     # of each character     freq = [0] * 26       # Stores the length of     # the string     n = len(s)       for i in range(n):           # Increase the number of swaps,         # the current character make with         # its previous occurrences         ans += freq[ord(s[i]) - ord('a')]           # Increase frequency         freq[ord(s[i]) - ord('a')] += 1           return ans   # Driver Code s = "aaabaaa"   print(findNewString(s))   # This code is contributed by code_hunt

## C#

 // C# Program to implement // the above approach using System; class GFG{   // Function to return the count of // possible palindromic Strings static long findNewString(String s) {     long ans = 0;       // Stores the frequencies     // of each character     int []freq = new int[26];       // Stores the length of     // the String     int n = s.Length;       for (int i = 0; i < (int)s.Length; ++i)     {           // Increase the number of swaps,         // the current character make with         // its previous occurrences         ans += freq[s[i] - 'a'];           // Increase frequency         freq[s[i] - 'a']++;     }     return ans; }   // Driver Code public static void Main(String[] args) {     String s = "aaabaaa";     Console.Write(findNewString(s)); } }   // This code is contributed by sapnasingh4991

## Javascript



Output:

15

Time Complexity: O(N)
Auxiliary Space: O(N)

Previous
Next
Share your thoughts in the comments