Skip to main content

Print all palindrome permutations of a string

Here given code implementation process.

import java.util.HashMap;
import java.util.HashSet;
/*
    Java program for
    Print all palindrome permutations of a string
*/
public class Palindrome
{
	public String reverseOrder(String result)
	{
		int n = result.length();
		String text = "";
		for (int i = n - 1; i >= 0; --i)
		{
			text = text + result.charAt(i);
		}
		return text;
	}
	//Swapping two string elements by index
	public String swap(String text, int size, int a, int b)
	{
		//Check valid location of swap element
		if ((a >= 0 && a < size) && (b >= 0 && b < size))
		{
			//Get first character
			char first = text.charAt(a);
			//Get second character
			char second = text.charAt(b);
			//Put character
			text = text.substring(0, b) + first + text.substring(b + 1);
			text = text.substring(0, a) + second + text.substring(a + 1);
		}
		return text;
	}
	// Method which is print all Palindrome permutation of given text
	public void permutablePalindrome(HashSet < String > result, String text, String middle, int index, int n)
	{
		if (index > n)
		{
			return;
		}
		if (index == n)
		{
			String value = text + middle + this.reverseOrder(text);
			if (result.contains(value) == false)
			{
				result.add(value);
			}
			return;
		}
		for (int i = index; i < n; ++i)
		{
			// swap char element 
			text = swap(text, n, i, index);
			permutablePalindrome(result, text, middle, index + 1, n);
			// swap char element 
			text = swap(text, n, i, index);
		}
	}
	public void permutation(String text)
	{
		// Use to count frequency of text character
		HashMap < Character, Integer > record = new HashMap < Character, Integer > ();
		// Use to collect unique permutations
		HashSet < String > result = new HashSet < String > ();
		// Auxiliary variable
		String auxiliary = "";
		String middle = "";
		// Get number of character
		int n = text.length();
		// Count frequency of character in given text
		for (int i = 0; i < n; ++i)
		{
			if (record.containsKey(text.charAt(i)))
			{
				record.put(text.charAt(i), record.get(text.charAt(i)) + 1);
			}
			else
			{
				record.put(text.charAt(i), 1);
			}
		}
		// Check that given string can be a palindrome permutations or not
		for (char k: record.keySet())
		{
			int temp = record.get(k) / 2;
			while (temp > 0)
			{
				auxiliary += k;
				temp--;
			}
			if ((record.get(k) % 2) != 0)
			{
				if (middle.equals(""))
				{
					// When middle element exists
					// Single digit
					middle += k;
				}
				else
				{
					System.out.print("Palindrome not possible in given text : " + text);
					return;
				}
			}
		}
		permutablePalindrome(result, auxiliary, middle, 0, n / 2);
		// Display given text
		System.out.println("Given text : " + text);
		System.out.println("Permutable Palindrome ");
		// Display result
		for (String value: result)
		{
			System.out.println(value);
		}
	}
	public static void main(String[] args)
	{
		Palindrome task = new Palindrome();
		// Test Case
		task.permutation("1231233");
		task.permutation("cabababacb");
	}
}

Output

Given text : 1231233
Permutable Palindrome
2313132
3123213
1233321
3213123
1323231
2133312
Given text : cabababacb
Permutable Palindrome
abcabbacba
aabbccbbaa
bacabbacab
acbbaabbca
bbcaaaacbb
bbaaccaabb
abacbbcaba
bcaabbaacb
baacbbcaab
cabbaabbac
cbaabbaabc
bbacaacabb
aacbbbbcaa
abbaccabba
acbabbabca
abcbaabcba
ababccbaba
babaccabab
aabcbbcbaa
abbcaacbba
acabbbbaca
bacbaabcab
bcbaaaabcb
baabccbaab
cababbabac
babcaacbab
bcabaabacb
cbbaaaabbc
caabbbbaac
cbabaababc
// Include header file
#include <iostream>
#include <set>
#include <string>
#include <unordered_map>

using namespace std;
/*
    C++ program for
    Print all palindrome permutations of a string
*/
class Palindrome
{
    public: string reverseOrder(string result)
    {
        int n = result.length();
        string text = "";
        for (int i = n - 1; i >= 0; --i)
        {
            text = text  +  result[i];
        }
        return text;
    }
    //Swap the string element of given indexes
    string swap(string text,int size,int a,int b)
    {
      if((a>=0 && a<size)  && (b >= 0 && b < size))
      {
        //When valid a and b location
        char temp = text[a];
        text[a] = text[b];
        text[b] = temp;

      }
      //return modified result
      return text;
    }
    // Method which is print all Palindrome permutation of given text
    void permutablePalindrome(set < string > &result, string text, string middle, int index, int n)
    {
        if (index > n)
        {
            return;
        }
        if (index == n)
        {
            string value = text  +  middle  +  this->reverseOrder(text);
            if (result.find(value) == result.end() )
            {
                result.insert(value);
            }
            return;
        }
        for (int i = index; i < n; ++i)
        {
            // swap char element 
            text = this->swap(text, n, i, index);

            this->permutablePalindrome(result, text, middle, index + 1, n);
            // swap char element 
            text = this->swap(text, n, i, index);
        }
    }
    void permutation(string text)
    {
        // Use to count frequency of text character
        unordered_map < char, int > record;
        // Use to collect unique permutations
        set < string > result;
        // Auxiliary variable
        string auxiliary = "";
        string middle = "";
        // Get number of character
        int n = text.length();
        // Count frequency of character in given text
        for (int i = 0; i < n; ++i)
        {
            if (record.find(text[i]) != record.end())
            {
                record[text[i]] = record[text[i]] + 1;
            }
            else
            {
                record[text[i]] = 1;
            }
        }
        // Check that given string can be a palindrome permutations or not
        for (auto &k: record)
        {
            int temp = (k.second / 2);
            while (temp > 0)
            {
                auxiliary += k.first;
                temp--;
            }
            if ((k.second % 2) != 0)
            {
                if (middle.compare("") == 0)
                {
                    // When middle element exists
                    // Single digit
                    middle = k.first;
                }
                else
                {
                    cout << "Palindrome not possible in given text : " << text;
                    return;
                }
            }
        }
        this->permutablePalindrome(result, auxiliary, middle, 0, n / 2);
        // Display given text
        cout << "Given text : " << text << endl;
        cout << "Permutable Palindrome " << endl;
        // Display result
        for (auto &value : result)
        {
            cout << value << endl;
        }
    }
};
int main()
{
    Palindrome *task = new Palindrome();
    // Test Case
    task->permutation("1231233");
    task->permutation("cabababacb");
    return 0;
}

Output

Given text : 1231233
Permutable Palindrome
1233321
1323231
2133312
2313132
3123213
3213123
Given text : cabababacb
Permutable Palindrome
aabbccbbaa
aabcbbcbaa
aacbbbbcaa
ababccbaba
abacbbcaba
abbaccabba
abbcaacbba
abcabbacba
abcbaabcba
acabbbbaca
acbabbabca
acbbaabbca
baabccbaab
baacbbcaab
babaccabab
babcaacbab
bacabbacab
bacbaabcab
bbaaccaabb
bbacaacabb
bbcaaaacbb
bcaabbaacb
bcabaabacb
bcbaaaabcb
caabbbbaac
cababbabac
cabbaabbac
cbaabbaabc
cbabaababc
cbbaaaabbc
// Include namespace system
using System;
using System.Collections.Generic;
/*
    Csharp program for
    Print all palindrome permutations of a string
*/
public class Palindrome
{
	public String reverseOrder(String result)
	{
		int n = result.Length;
		String text = "";
		for (int i = n - 1; i >= 0; --i)
		{
			text = text + result[i];
		}
		return text;
	}
	//Swapping two string elements by index
	public String swap(String text, int size, int a, int b)
	{
		//Check valid location of swap element
		if ((a >= 0 && a < size) && (b >= 0 && b < size))
		{
			//Get first character
			char first = text[a];
			//Get second character
			char second = text[b];
			//Put character
			text = text.Substring(0, b) + first + text.Substring(b + 1);
			text = text.Substring(0, a) + second + text.Substring(a + 1);
		}
		return text;
	}
	// Method which is print all Palindrome permutation of given text
	public void permutablePalindrome(HashSet < string > result, 
                                      String text, String middle, 
                                      int index, int n)
	{
		if (index > n)
		{
			return;
		}
		if (index == n)
		{
			String value = text + middle + this.reverseOrder(text);
			if (result.Contains(value) == false)
			{
				result.Add(value);
			}
			return;
		}
		for (int i = index; i < n; ++i)
		{
			// swap char element 
			text = this.swap(text, n, i, index);
			this.permutablePalindrome(result, text, middle, index + 1, n);
			// swap char element 
			text = this.swap(text, n, i, index);
		}
	}
	public void permutation(String text)
	{
		// Use to count frequency of text character
		Dictionary < char, int > record = new Dictionary < char, int > ();
		// Use to collect unique permutations
		HashSet < string > result = new HashSet < string > ();
		// Auxiliary variable
		String auxiliary = "";
		String middle = "";
		// Get number of character
		int n = text.Length;
		// Count frequency of character in given text
		for (int i = 0; i < n; ++i)
		{
			if (record.ContainsKey(text[i]))
			{
				record[text[i]] = record[text[i]] + 1;
			}
			else
			{
				record.Add(text[i], 1);
			}
		}
		// Check that given string can be a palindrome permutations or not
		foreach(KeyValuePair < char, int > k in record)
		{
			int temp = k.Value / 2;
			while (temp > 0)
			{
				auxiliary += k.Key;
				temp--;
			}
			if ((k.Value % 2) != 0)
			{
				if (middle.Equals(""))
				{
					// When middle element exists
					// Single digit
					middle += k.Key;
				}
				else
				{
					Console.Write("Palindrome not possible in given text : " +
                                  text);
					return;
				}
			}
		}
		this.permutablePalindrome(result, auxiliary, middle, 0, n / 2);
		// Display given text
		Console.WriteLine("Given text : " + text);
		Console.WriteLine("Permutable Palindrome ");
		// Display result
		foreach(String value in result)
		{
			Console.WriteLine(value);
		}
	}
	public static void Main(String[] args)
	{
		Palindrome task = new Palindrome();
		// Test Case
		task.permutation("1231233");
		task.permutation("cabababacb");
	}
}

Output

Given text : 1231233
Permutable Palindrome
1233321
1323231
2133312
2313132
3213123
3123213
Given text : cabababacb
Permutable Palindrome
caabbbbaac
cababbabac
cabbaabbac
cbaabbaabc
cbabaababc
cbbaaaabbc
acabbbbaca
acbabbabca
acbbaabbca
aacbbbbcaa
aabcbbcbaa
aabbccbbaa
abacbbcaba
ababccbaba
abcabbacba
abcbaabcba
abbcaacbba
abbaccabba
baacbbcaab
baabccbaab
bacabbacab
bacbaabcab
babcaacbab
babaccabab
bcaabbaacb
bcabaabacb
bcbaaaabcb
bbacaacabb
bbaaccaabb
bbcaaaacbb
<?php
/*
    Php program for
    Print all palindrome permutations of a string
*/
class Palindrome
{
	public function reverseOrder($result)
	{
		$n = strlen($result);
		$text = "";
		for ($i = $n - 1; $i >= 0; --$i)
		{
			$text = $text.strval($result[$i]);
		}
		return $text;
	}
    //Swapping two string elements by index
    public  function swap($text, $size, $a, $b) {
      //Check valid location of swap element

      if (($a >= 0 && $a < $size) && ($b >= 0 && $b < $size)) {
        //Get first character
        $first = $text[$a];
        //Get second character
        $second = $text[$b];
        //Put character
        $text = substr($text,0, $b-strlen($text)) . $first .substr($text,$b+1 );

        $text = substr($text,0, $a-strlen($text)) . $second .substr($text,$a+1 );
      }
      return $text;
    }

	// Method which is print all Palindrome permutation of given text
	public	function permutablePalindrome(&$result, $text, $middle, $index, $n)
	{
		if ($index > $n)
		{
			return;
		}
		if ($index == $n)
		{
			$value = $text.$middle.$this->reverseOrder($text);
			if (in_array($value, $result, TRUE) == false)
			{
				$result[] = $value;
				
			}
			return;
		}
		for ($i = $index; $i < $n; ++$i)
		{
			// swap char element 
			$text = $this->swap($text, $n, $i, $index);
			$this->permutablePalindrome(
              $result, $text, $middle, $index + 1, $n
            );
			// swap char element 
			$text = $this->swap($text, $n, $i, $index);
		}
	}
	public	function permutation($text)
	{
		// Use to count frequency of text character
		$record = array();
		// Use to collect unique permutations
		$result = array();
		// Auxiliary variable
		$auxiliary = "";
		$middle = "";
		// Get number of character
		$n = strlen($text);
		// Count frequency of character in given text
		for ($i = 0; $i < $n; ++$i)
		{
			if (array_key_exists($text[$i], $record))
			{
				$record[$text[$i]] = $record[$text[$i]] + 1;
			}
			else
			{
				$record[$text[$i]] = 1;
			}
		}
		// Check that given string can be a palindrome permutations or not
		foreach($record as $key => $value)
		{
			$temp = (int)($value / 2);
			while ($temp > 0)
			{
				$auxiliary .= $key;
				$temp--;
			}
			if (($value % 2) != 0)
			{
				if ((strcmp($middle, "") == 0))
				{
					// When middle element exists
					// Single digit
					$middle .= $key;
				}
				else
				{
					echo("Palindrome not possible in given text : ".$text);
					return;
				}
			}
		}
		$this->permutablePalindrome($result, $auxiliary, 
                                    $middle, 0, (int)($n / 2));
		// Display given text
		echo("Given text : ".$text."\n");
		echo("Permutable Palindrome "."\n");
		// Display result
		foreach($result as $key => $value)
		{
			echo($value."\n");
		}
	}
}

function main()
{
	$task = new Palindrome();
	// Test Case
	$task->permutation("1231233");
	$task->permutation("cabababacb");
}
main();

Output

Given text : 1231233
Permutable Palindrome
1233321
1323231
2133312
2313132
3213123
3123213
Given text : cabababacb
Permutable Palindrome
caabbbbaac
cababbabac
cabbaabbac
cbaabbaabc
cbabaababc
cbbaaaabbc
acabbbbaca
acbabbabca
acbbaabbca
aacbbbbcaa
aabcbbcbaa
aabbccbbaa
abacbbcaba
ababccbaba
abcabbacba
abcbaabcba
abbcaacbba
abbaccabba
baacbbcaab
baabccbaab
bacabbacab
bacbaabcab
babcaacbab
babaccabab
bcaabbaacb
bcabaabacb
bcbaaaabcb
bbacaacabb
bbaaccaabb
bbcaaaacbb
/*
    Node JS program for
    Print all palindrome permutations of a string
*/
class Palindrome
{
	reverseOrder(result)
	{
		var n = result.length;
		var text = "";
		for (var i = n - 1; i >= 0; --i)
		{
			text = text + result.charAt(i);
		}
		return text;
	}
	//Swapping two string elements by index
	swap(text, size, a, b)
	{
		//Check valid location of swap element
		if ((a >= 0 && a < size) && (b >= 0 && b < size))
		{
			//Get first character
			var first = text.charAt(a);
			//Get second character
			var second = text.charAt(b);
			//Put character
			text = text.substring(0, b) + first + text.substring(b + 1);
			text = text.substring(0, a) + second + text.substring(a + 1);
		}
		return text;
	}
	// Method which is print all Palindrome permutation of given text
	permutablePalindrome(result, text, middle, index, n)
	{
		if (index > n)
		{
			return;
		}
		if (index == n)
		{
			var value = text + middle + this.reverseOrder(text);
			if (result.has(value) == false)
			{
				result.add(value);
			}
			return;
		}
		for (var i = index; i < n; ++i)
		{
			// swap char element 
			text = this.swap(text, n, i, index);
			this.permutablePalindrome(result, text, middle, index + 1, n);
			// swap char element 
			text = this.swap(text, n, i, index);
		}
	}
	permutation(text)
	{
		// Use to count frequency of text character
		var record = new Map();
		// Use to collect unique permutations
		var result = new Set();
		// Auxiliary variable
		var auxiliary = "";
		var middle = "";
		// Get number of character
		var n = text.length;
		// Count frequency of character in given text
		for (var i = 0; i < n; ++i)
		{
			if (record.has(text.charAt(i)))
			{
				record.set(text.charAt(i), record.get(text.charAt(i)) + 1);
			}
			else
			{
				record.set(text.charAt(i), 1);
			}
		}
		// Check that given string can be a palindrome permutations or not
		for (let [key, value] of record)
		{
			var temp = parseInt(value / 2);
			while (temp > 0)
			{
				auxiliary += key;
				temp--;
			}
			if ((value % 2) != 0)
			{
				if ((middle.localeCompare("") == 0))
				{
					// When middle element exists
					// Single digit
					middle += key;
				}
				else
				{
					process.stdout.write(
                      "Palindrome not possible in given text : " + text
                    );
					return;
				}
			}
		}
		this.permutablePalindrome(
          result, auxiliary, middle, 0, parseInt(n / 2)
        );
		// Display given text
		console.log("Given text : " + text);
		console.log("Permutable Palindrome ");
		// Display result
		for (let value of result)
		{
			console.log(value);
		}
	}
}

function main()
{
	var task = new Palindrome();
	// Test Case
	task.permutation("1231233");
	task.permutation("cabababacb");
}
main();

Output

Given text : 1231233
Permutable Palindrome
1233321
1323231
2133312
2313132
3213123
3123213
Given text : cabababacb
Permutable Palindrome
caabbbbaac
cababbabac
cabbaabbac
cbaabbaabc
cbabaababc
cbbaaaabbc
acabbbbaca
acbabbabca
acbbaabbca
aacbbbbcaa
aabcbbcbaa
aabbccbbaa
abacbbcaba
ababccbaba
abcabbacba
abcbaabcba
abbcaacbba
abbaccabba
baacbbcaab
baabccbaab
bacabbacab
bacbaabcab
babcaacbab
babaccabab
bcaabbaacb
bcabaabacb
bcbaaaabcb
bbacaacabb
bbaaccaabb
bbcaaaacbb
#    Python 3 program for
#    Print all palindrome permutations of a string
class Palindrome :
    def reverseOrder(self, result) :
        n = len(result)
        text = ""
        i = n - 1
        while (i >= 0) :
            text = text + str(result[i])
            i -= 1
        
        return text
    
    # Swapping two string elements by index

    def swap(self, text, size, a, b) :
        # Check valid location of swap element
        if ((a >= 0 and a < size) and(b >= 0 and b < size)) :
          data = list(text)
          data[a],data[b] = data[b],data[a]
          return ''.join(data)

        return text 
        
    #  Method which is print all Palindrome permutation of given text
    def permutablePalindrome(self, result, text, middle, index, n) :
        if (index > n) :
            return
        
        if (index == n) :
            value = text + middle + self.reverseOrder(text)
            if (value in result ) == False :
                result.add(value)
            
            return
        
        i = index
        while (i < n) :
            # swap the list element
            text = self.swap(text, n, i, index)
            self.permutablePalindrome(result, text, middle, index + 1, n)
            # swap the list element
            text = self.swap(text, n, i, index)
            i += 1
        
    
    def permutation(self, text) :
        #  Use to count frequency of text character
        record = dict()
        #  Use to collect unique permutations
        result = set()
        #  Auxiliary variable
        auxiliary = ""
        middle = ""
        #  Get number of character
        n = len(text)
        i = 0
        #  Count frequency of character in given text
        while (i < n) :
            if ((text[i] in record.keys())) :
                record[text[i]] = record.get(text[i]) + 1
            else :
                record[text[i]] = 1
            
            i += 1
        
        for key, value in record.items() :
            temp = int(value / 2)
            while (temp > 0) :
                auxiliary += key
                temp -= 1
            
            if ((value % 2) != 0) :
                if (middle == "") :
                    #  When middle element exists
                    #  Single digit
                    middle += key
                else :
                    print("Palindrome not possible in given text : ", 
                          text, end = "")
                    return
                
            
        
        self.permutablePalindrome(result, 
                                  auxiliary, 
                                  middle, 0, 
                                  int(n / 2))
        #  Display given text
        print("Given text : ", text)
        print("Permutable Palindrome ")
        for value in result :
            print(value)
        
    

def main() :
    task = Palindrome()
    #  Test Case
    task.permutation("1231233")
    task.permutation("cabababacb")

if __name__ == "__main__": main()

Output

Given text :  1231233
Permutable Palindrome
1233321
3123213
2133312
2313132
3213123
1323231
Given text :  cabababacb
Permutable Palindrome
ababccbaba
abcabbacba
cababbabac
aabcbbcbaa
caabbbbaac
bcabaabacb
cbbaaaabbc
aabbccbbaa
bacabbacab
acbbaabbca
bacbaabcab
abbcaacbba
baabccbaab
acabbbbaca
acbabbabca
bcaabbaacb
bcbaaaabcb
abcbaabcba
babcaacbab
cbabaababc
bbacaacabb
abacbbcaba
cabbaabbac
cbaabbaabc
bbcaaaacbb
babaccabab
aacbbbbcaa
baacbbcaab
bbaaccaabb
abbaccabba
require 'set'
#    Ruby program for
#    Print all palindrome permutations of a string
class Palindrome 
	def reverseOrder(result) 
		n = result.length
		text = ""
		i = n - 1
		while (i >= 0) 
			text = text + result[i].to_s
			i -= 1
		end

		return text
	end

	# Swapping two string elements by index
	def swap(text, size, a, b) 
		 # Check valid location of swap element
		if ((a >= 0 && a < size) && (b >= 0 && b < size)) 
			 # Get first character
			first = text[a]
			text[a]=text[b]
			text[b]=first
		end
		return text
	end

	#  Method which is print all Palindrome permutation of given text
	def permutablePalindrome(result, text, middle, index, n) 
		if (index > n) 
			return
		end

		if (index == n) 
			value = text + middle + self.reverseOrder(text)
			if (result.include?(value) == false) 
				result.add(value)
			end

			return
		end

		i = index
		while (i < n) 
			#  swap char element 
			text = self.swap(text, n, i, index)
			self.permutablePalindrome(result, text, middle, index + 1, n)
			#  swap char element 
			text = self.swap(text, n, i, index)
			i += 1
		end

	end

	def permutation(text) 
		#  Use to count frequency of text character
		record = Hash.new()
		#  Use to collect unique permutations
		result = SortedSet.new()
		#  Auxiliary variable
		auxiliary = ""
		middle = ""
		#  Get number of character
		n = text.length
		i = 0
		#  Count frequency of character in given text
		while (i < n) 
			if (record.key?(text[i])) 
				record[text[i]] = record[text[i]] + 1
			else
 
				record[text[i]] = 1
			end

			i += 1
		end

		#  Check that given string can be a palindrome permutations or not
		record.each { | key, value | temp = value / 2
		while (temp > 0) 
			auxiliary += key
			temp -= 1
		end

		if ((value % 2) != 0) 
			if (middle === "") 
				#  When middle element exists
				#  Single digit
				middle += key
			else
 
				print("Palindrome not possible in given text : ", text)
				return
			end

		end

		}
		self.permutablePalindrome(result, auxiliary, middle, 0, n / 2)
		#  Display given text
		print("Given text : ", text, "\n")
		print("Permutable Palindrome ", "\n")
		#  Display result
		result.each do |value| 
			print(value, "\n")
		end

	end

end

def main() 
	task = Palindrome.new()
	#  Test Case
	task.permutation("1231233")
	task.permutation("cabababacb")
end

main()

Output

Given text : 1231233
Permutable Palindrome 
1233321
1323231
2133312
2313132
3123213
3213123
Given text : cabababacb
Permutable Palindrome 
aabbccbbaa
aabcbbcbaa
aacbbbbcaa
ababccbaba
abacbbcaba
abbaccabba
abbcaacbba
abcabbacba
abcbaabcba
acabbbbaca
acbabbabca
acbbaabbca
baabccbaab
baacbbcaab
babaccabab
babcaacbab
bacabbacab
bacbaabcab
bbaaccaabb
bbacaacabb
bbcaaaacbb
bcaabbaacb
bcabaabacb
bcbaaaabcb
caabbbbaac
cababbabac
cabbaabbac
cbaabbaabc
cbabaababc
cbbaaaabbc
import scala.collection.mutable._;
/*
    Scala program for
    Print all palindrome permutations of a string
*/
class Palindrome()
{
	def reverseOrder(result: String): String = {
		var n: Int = result.length();
		var text: String = "";
		var i: Int = n - 1;
		while (i >= 0)
		{
			text = text + result.charAt(i).toString();
			i -= 1;
		}
		return text;
	}
	//Swapping two string elements by index
	def swap(info: String, size: Int, a: Int, b: Int): String = {
		//Check valid location of swap element
      	var text = info;
		if ((a >= 0 && a < size) && (b >= 0 && b < size)) {
			//Get first character
			val first: Char = text(a);

			//Get second character
			val second: Char = text(b);

			//Put character
			text = text.substring(0, b) + first + text.substring(b + 1);
			text = text.substring(0, a) + second + text.substring(a + 1);
		}
		return text;
	}
	// Method which is print all Palindrome permutation of given text
	def permutablePalindrome(result: Set[String], text: String, middle: String, index: Int, n: Int): Unit = {
		if (index > n)
		{
			return;
		}
		if (index == n)
		{
			var value: String = text + middle + this.reverseOrder(text);
			if (result.contains(value) == false)
			{
				result.add(value);
			}
			return;
		}
		var i: Int = index;
		var new_str = text;
		while (i < n)
		{
			//  swap char element 
			new_str = swap(new_str, n, i, index);
			permutablePalindrome(result, new_str, middle, index + 1, n);
			//  swap char element 
			new_str = swap(new_str, n, i, index);
			i += 1;
		}
	}
	def permutation(text: String): Unit = {
		// Use to count frequency of text character
		var record: HashMap[Character, Int] = new HashMap[Character, Int]();
		// Use to collect unique permutations
		var result: Set[String] = Set();
		// Auxiliary variable
		var auxiliary: String = "";
		var middle: String = "";
		// Get number of character
		var n: Int = text.length();
		var i: Int = 0;
		// Count frequency of character in given text
		while (i < n)
		{
			if (record.contains(text.charAt(i)))
			{
				record.addOne(text.charAt(i), record.get(text.charAt(i)).get + 1);
			}
			else
			{
				record.addOne(text.charAt(i), 1);
			}
			i += 1;
		}
		// Check that given string can be a palindrome permutations or not
		for((key,value) <- record)
		{
			var temp: Int = value / 2;
			while (temp > 0)
			{
				auxiliary += key;
				temp -= 1;
			}
			if ((value % 2) != 0)
			{
				if (middle.equals(""))
				{
					// When middle element exists
					// Single digit
					middle += key;
				}
				else
				{
					print("Palindrome not possible in given text : " + text);
					return;
				}
			}
		}
		permutablePalindrome(result, auxiliary, middle, 0, n / 2);
		// Display given text
		println("Given text : " + text);
		println("Permutable Palindrome ");
		// Display result
		for (value <- result)
		{
			println(value);
		}
	}
}
object Main
{
	def main(args: Array[String]): Unit = {
		var task: Palindrome = new Palindrome();
		// Test Case
		task.permutation("1231233");
		task.permutation("cabababacb");
	}
}

Output

Given text : 1231233
Permutable Palindrome
2313132
3123213
3213123
1233321
1323231
2133312
Given text : cabababacb
Permutable Palindrome
abcabbacba
aabbccbbaa
bacabbacab
acbbaabbca
bbcaaaacbb
bbaaccaabb
abacbbcaba
bcaabbaacb
baacbbcaab
cbaabbaabc
cabbaabbac
bbacaacabb
abbaccabba
aacbbbbcaa
acbabbabca
abcbaabcba
ababccbaba
babaccabab
aabcbbcbaa
bacbaabcab
acabbbbaca
abbcaacbba
bcbaaaabcb
baabccbaab
cababbabac
babcaacbab
cbbaaaabbc
bcabaabacb
caabbbbaac
cbabaababc
import Foundation;
/*
    Swift 4 program for
    Print all palindrome permutations of a string
*/
class Palindrome
{
	func reverseOrder(_ result: String) -> String
	{
		let n: Int = result.count;
		var text: String = "";
		var i: Int = n - 1;
      	let data = Array(result);
		while (i >= 0)
		{
			text = text + String(data[i]);
			i -= 1;
		}
		return text;
	}
	//Swapping two string elements by index
	func swap(_ text: String, _ size: Int, _ a: Int, _ b: Int) -> String
	{
		//Check valid location of swap element
		if ((a >= 0 && a < size) && (b >= 0 && b < size))
		{
			var result = Array(text)

			(result[a],result[b]) = (result[b] ,result[a])
			
			return String(result)
		}
		else
		{
			return text;
		}

	}
	// Method which is print all Palindrome permutation of given text
	func permutablePalindrome(_ result: inout Set<String>, 
      _ text: String, _ middle: String, _ index: Int, _ n: Int)
	{
		if (index > n)
		{
			return;
		}
		if (index == n)
		{
			let value: String = text + middle + self.reverseOrder(text);

			result.insert(value);
			
			return;
		}
		var i: Int = index;
      	var data = text;
		while (i < n)
		{

			//  swap char element 
			data = self.swap(data, n, i, index);
			self.permutablePalindrome(&result, data, middle, index + 1, n);
			//  swap char element 
			data = self.swap(data, n, i, index);
			i += 1;
		}
	}
	func permutation(_ data: String)
	{	let text = Array(data);
		// Use to count frequency of text character
		var record = [Character : Int]();
		// Use to collect unique permutations
		var result = Set<String>()
		// Auxiliary variable
		var auxiliary: String = "";
		var middle: String = "";
		// Get number of character
		let n: Int = text.count;
		var i: Int = 0;
		// Count frequency of character in given text
		while (i < n)
		{
			if (record.keys.contains(text[i]))
			{
				record[text[i]] = record[text[i]]! + 1;
			}
			else
			{
				record[text[i]] = 1;
			}
			i += 1;
		}
		// Check that given string can be a palindrome permutations or not
		for (key, value) in record
		{
			var temp: Int = value / 2;
			while (temp > 0)
			{
				auxiliary += String(key);
				temp -= 1;
			}
			if ((value % 2)  != 0)
			{
				if (middle == "")
				{
					// When middle element exists
					// Single digit
					middle += String(key);
				}
				else
				{
					print("Palindrome not possible in given text : ", 
                          text, terminator: "");
					return;
				}
			}
		}
		self.permutablePalindrome(&result, auxiliary, middle, 0, n / 2);
		// Display given text
		print("Given text : ", data);
		print("Permutable Palindrome ");
		// Display result
		for value in result
		{
			print(value);
		}
	}
}
func main()
{
	let task: Palindrome = Palindrome();
	// Test Case
	task.permutation("1231233");
	task.permutation("cabababacb");
}
main();

Output

Given text :  1231233
Permutable Palindrome
1233321
3213123
1323231
2313132
2133312
3123213
Given text :  cabababacb
Permutable Palindrome
bacabbacab
caabbbbaac
babcaacbab
babaccabab
bbaaccaabb
abbcaacbba
abcbaabcba
bcbaaaabcb
bbcaaaacbb
cbabaababc
abacbbcaba
bbacaacabb
baabccbaab
aacbbbbcaa
acbabbabca
ababccbaba
aabbccbbaa
baacbbcaab
bacbaabcab
bcabaabacb
acabbbbaca
cababbabac
cbbaaaabbc
bcaabbaacb
abbaccabba
aabcbbcbaa
cabbaabbac
abcabbacba
cbaabbaabc
acbbaabbca
/*
    Kotlin program for
    Print all palindrome permutations of a string
*/
class Palindrome
{
	fun reverseOrder(result: String): String 
	{
		val n: Int = result.length;
		var text: String = "";
		var i: Int = n - 1;
		while (i >= 0)
		{
			text = text + result.get(i).toString();
			i -= 1;
		}
		return text;
	}
	//Swapping two string elements by index
	fun swap(text: String, size: Int, a: Int, b: Int): String
	{
		//Check valid location of swap element
		if ((a >= 0 && a < size) && (b >= 0 && b < size))
		{
			//Get first character
			val first: Char = text.get(a);
			//Get second character
			val second: Char = text.get(b);
          	var result = text;
			//Put character
			result = result.substring(0, b) + first.toString() +
              result.substring(b + 1);
			result = result.substring(0, a) + second.toString() + 
              result.substring(a + 1);
          	return result;
		}
		return text;
	}
	// Method which is print all Palindrome permutation of given text
	fun permutablePalindrome(result: MutableSet <String>, 
                             text : String, middle: String, 
                             index: Int, n: Int): Unit
	{
		if (index > n)
		{
			return;
		}
		if (index == n)
		{
			val value: String = text + middle + this.reverseOrder(text);
			result.add(value);
			
			return;
		}
		var i: Int = index;
      	var data = text;
		while (i < n)
		{
			// swap char element 
			data = this.swap(data, n, i, index);
			this.permutablePalindrome(result, data, middle, index + 1, n);
			// swap char element 
			data = this.swap(data, n, i, index);
			i += 1;
		}
	}
	fun permutation(text: String): Unit
	{
		// Use to count frequency of text character
		var record = mutableMapOf<Char, Int>();
		// Use to collect unique permutations
		var result: MutableSet <String> = mutableSetOf <String> ();
		// Auxiliary variable
		var auxiliary: String = "";
		var middle: String = "";
		// Get number of character
		val n: Int = text.length;
		var i: Int = 0;
		// Count frequency of character in given text
		while (i < n)
		{
			if (record.containsKey(text.get(i)))
			{
				record.put(text.get(i), record.getValue(text.get(i)) + 1);
			}
			else
			{
				record.put(text.get(i), 1);
			}
			i += 1;
		}
		// Check that given string can be a palindrome permutations or not
		for ((key, value) in record)
		{
			var temp: Int = value / 2;
			while (temp > 0)
			{
				auxiliary += key;
				temp -= 1;
			}
			if ((value % 2) != 0)
			{
				if (middle.equals(""))
				{
					// When middle element exists
					// Single digit
					middle += key;
				}
				else
				{
					print("Palindrome not possible in given text : " + text);
					return;
				}
			}
		}
		this.permutablePalindrome(result, auxiliary, middle, 0, n / 2);
		// Display given text
		println("Given text : " + text);
		println("Permutable Palindrome ");
		// Display result
		for (value in result)
		{
			println(value);
		}
	}
}
fun main(args: Array < String > ): Unit
{
	val task: Palindrome = Palindrome();
	// Test Case
	task.permutation("1231233");
	task.permutation("cabababacb");
}

Output

Given text : 1231233
Permutable Palindrome
1233321
1323231
2133312
2313132
3213123
3123213
Given text : cabababacb
Permutable Palindrome
caabbbbaac
cababbabac
cabbaabbac
cbaabbaabc
cbabaababc
cbbaaaabbc
acabbbbaca
acbabbabca
acbbaabbca
aacbbbbcaa
aabcbbcbaa
aabbccbbaa
abacbbcaba
ababccbaba
abcabbacba
abcbaabcba
abbcaacbba
abbaccabba
baacbbcaab
baabccbaab
bacabbacab
bacbaabcab
babcaacbab
babaccabab
bcaabbaacb
bcabaabacb
bcbaaaabcb
bbacaacabb
bbaaccaabb
bbcaaaacbb




Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment