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: 2
Explanation:
1st Swap: abba -> abba
2nd Swap: abba -> abba
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 <bits/stdc++.h>
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
<script>
// JavaScript program to implement
// the above approach
// Function to return the count of
// possible palindromic strings
function findNewString(s) {
var ans = 0;
// Stores the frequencies
// of each character
var freq = new Array(26).fill(0);
// Stores the length of
// the string
var n = s.length;
for (let i = 0; i < n; i++) {
// Increase the number of swaps,
// the current character make with
// its previous occurrences
ans += freq[s[i].charCodeAt(0) - "a".charCodeAt(0)];
// Increase frequency
freq[s[i].charCodeAt(0) - "a".charCodeAt(0)] += 1;
}
return ans;
}
// Driver Code
var s = "aaabaaa";
document.write(findNewString(s));
</script>
Time Complexity: O(N)
Auxiliary Space: O(N)
Similar Reads
Palindromic strings of length 3 possible by using characters of a given string Given a string S consisting of N characters, the task is to print all palindromic strings of length 3 in lexicographical order that can be formed using characters of the given string S. Examples: Input: S = "aabc"Output:abaaca Input: S = "ddadbac"Output:abaacaadadaddbddcdddd Approach: The given prob
9 min read
Make the string lexicographically smallest and non palindromic by swapping of adjacent pair of characters Given string str consisting of lowercase alphabets, the task is to construct the lexicographically smallest non-palindromic string by swapping any pair of adjacent characters from the string any number of times. If the given string cannot be converted to a lexicographically smallest non-palindromic
5 min read
Longest Substring that can be made a palindrome by swapping of characters Given a numeric string S, the task is to find the longest non-empty substring that can be made palindrome. Examples: Input: S = "3242415"Output: 5Explanation: "24241" is the longest such substring which can be converted to the palindromic string "24142". Input: S = "213123"Output: 6Explanation: "213
12 min read
Count of pairs of strings whose concatenation forms a palindromic string Given an array A[ ] consisting of N strings, the task is to count the number of pairs of possible strings that on merging forms a Palindromic String or can be rearranged to form a Palindromic String. Example : Input: N = 6, A[ ] = {aab, abcac, dffe, ed, aa, aade}Output: 6Explanation: All possible pa
9 min read
Make all Strings palindrome by swapping characters from adjacent Strings Given an array of strings S[] of size X where each string has length N. In one move, you can swap the ith character of two adjacent strings, the task is to find the minimum number of moves to make every string a palindrome. If this is not possible, print -1. Examples: Input: S[] = {"13", "21", "32"}
10 min read