Check if K palindromic strings can be formed from a given string

Given a string S of size N and an integer K, the task is to find whether the characters of the string can be arranged to make K palindromic strings simultaneously. 
Examples:

Input: S = “annabelle”, K = 2 
Output: Yes 
Explanation: 
All characters of string S can be distributed into “elble” and “anna” which are both palindromic.
Input: S =”abcd”, K = 4 
Output: Yes 
Explanation: 
Partition all characters of string as single character.

Approach

Hence, follow the steps below to solve the problem:

If K exceeds the length of the string, straightaway print “No”.  



  1. Store the frequency of all characters in a Map.
  2. Count the number of characters having an odd frequency.
  3. If the count is less than given K, then print “No”. Otherwise, print “Yes”.

Below is the implementation of the above approach: 

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to check
// whether the string is
// K palindrome or not
#include <iostream>
#include <map>
using namespace std;
 
// function to check
// whether the string is
// K palindrome or not
bool can_Construct(string S, int K)
{
    // map to frequency of character
    map<int, int> m;
 
    int i = 0, j = 0, p = 0;
 
    // Check when k is given
    // as same as length of string
    if (S.length() == K) {
        return true;
    }
 
    // iterator for map
    map<int, int>::iterator h;
 
    // stroing the frequency of every
    // character in map
    for (i = 0; i < S.length(); i++) {
        m[S[i]] = m[S[i]] + 1;
    }
 
    // if K is greater than size
    // of string then return false
    if (K > S.length()) {
        return false;
    }
 
    else {
 
        // check that number of character
        // having the odd frequency
        for (h = m.begin(); h != m.end(); h++) {
 
            if (m[h->first] % 2 != 0) {
                p = p + 1;
            }
        }
    }
 
    // if k is less than number of odd
    // frequecny character then it is
    // again false other wise true
    if (K < p) {
        return false;
    }
 
    return true;
}
 
// Driver code
int main()
{
    string S = "annabelle";
    int K = 4;
 
    if (can_Construct(S, K)) {
        cout << "Yes";
    }
    else {
        cout << "No";
    }
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to check
// whether the string is
// K palindrome or not
import java.util.*;
 
class GFG{
 
// Function to check whether
// the string is K palindrome or not
static boolean can_Construct(String S, int K)
{
     
    // Map to frequency of character
    Map<Character, Integer> m = new HashMap<>();
     
    int p = 0;
     
    // Check when k is given
    // as same as length of string
    if (S.length() == K)
        return true;
     
    // Stroing the frequency of every
    // character in map
    for(int i = 0; i < S.length(); i++)
        m.put(S.charAt(i),
              m.getOrDefault(S.charAt(i), 0) + 1);
               
    // If K is greater than size
    // of then return false
    if (K > S.length())
        return false;
     
    else
    {
         
        // Check that number of character
        // having the odd frequency
        for(Integer h : m.values())
        {
            if (h % 2 != 0)
                p = p + 1;
        }
    }
     
    // If k is less than number of odd
    // frequecny character then it is
    // again false otherwise true
    if (K < p)
        return false;
     
    return true;
}
 
// Driver Code
public static void main (String[] args)
{
    String S = "annabelle";
    int K = 4;
     
    if (can_Construct(S, K))
        System.out.println("Yes");
    else
        System.out.println("No");
}
}
 
// This code is contributed by offbeat
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to check whether
# the is K palindrome or not
 
# Function to check whether
# the is K palindrome or not
def can_Construct(S, K):
     
    # map to frequency of character
    m = dict()
    p = 0
     
    # Check when k is given
    # as same as length of string
    if (len(S) == K):
        return True
 
    # Stroing the frequency of every
    # character in map
    for i in S:
        m[i] = m.get(i, 0) + 1
 
    # If K is greater than size
    # of then return false
    if (K > len(S)):
        return False
 
    else:
 
        # Check that number of character
        # having the odd frequency
        for h in m:
            if (m[h] % 2 != 0):
                p = p + 1
 
    # If k is less than number of odd
    # frequecny character then it is
    # again false otherwise true
    if (K < p):
        return False
 
    return True
 
# Driver code
if __name__ == '__main__':
     
    S = "annabelle"
    K = 4
 
    if (can_Construct(S, K)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by mohit kumar 29
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to check
// whether the string is
// K palindrome or not
using System;
using System.Collections.Generic;
class GFG{
 
// Function to check whether
// the string is K palindrome or not
static bool can_Construct(String S,
                          int K)
{    
  // Map to frequency of character
  Dictionary<char,
             int> m = new Dictionary<char,
                                     int>();
  int p = 0;
 
  // Check when k is given
  // as same as length of string
  if (S.Length == K)
    return true;
 
  // Stroing the frequency of every
  // character in map
  for(int i = 0; i < S.Length; i++)
    if(!m.ContainsKey(S[i]))
      m.Add(S[i], 1);
  else
    m[S[i]] = m[S[i]] + 1;
 
  // If K is greater than size
  // of then return false
  if (K > S.Length)
    return false;
 
  else
  {
    // Check that number of character
    // having the odd frequency
    foreach(int h in m.Values)
    {
      if (h % 2 != 0)
        p = p + 1;
    }
  }
 
  // If k is less than number of odd
  // frequecny character then it is
  // again false otherwise true
  if (K < p)
    return false;
 
  return true;
}
 
// Driver Code
public static void Main(String[] args)
{
  String S = "annabelle";
  int K = 4;
  if (can_Construct(S, K))
    Console.WriteLine("Yes");
  else
    Console.WriteLine("No");
}
}
 
// This code is contributed by shikhasingrajput
chevron_right

Output: 
Yes


 

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




Recommended Posts:


Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Article Tags :
Practice Tags :