📜  打印字符的排列位置以制作回文

📅  最后修改于: 2022-05-13 01:57:08.728000             🧑  作者: Mango

打印字符的排列位置以制作回文

你得到一个长度为 n 的字符串s(只有小写字母)。打印它必须获取的字符串的每个字符的位置,以便形成一个回文字符串。

例子:

Input  : c b b a a
Output : 3 1 5 2 4
To make string palindrome 'c' must be at position 3,
'b' at 1 and 5, 'a' at 2 and 4.

Input : a b c
Output : Not Possible
Any permutation of string cannot form palindrome. 

这个想法是创建一个向量数组(或动态大小数组)来存储每个字符的所有位置。存储位置后,我们检查奇数字符的数量是否超过一个。如果是,我们返回“不可能”。否则,我们首先打印数组的前半个位置,然后是奇数字符的一个位置(如果存在),最后是后半个位置。

C++
// CPP program to print original
// positions of characters in a
// string after rearranging and
// forming a palindrome
#include 
using namespace std;
 
// Maximum number of characters
const int MAX = 256;
 
void printPalindromePos(string &str)
{
    // Insert all positions of every
    // character in the given string.
    vector pos[MAX];
    int n = str.length();
    for (int i = 0; i < n; i++)
        pos[str[i]].push_back(i+1);
 
    /* find the number of odd elements.
       Takes O(n) */
    int oddCount = 0;
    char oddChar;
    for (int i=0; i 1)
        cout << "NO PALINDROME";
 
    /* Print positions in first half
       of palindrome */
    for (int i=0; i 0)
    {
        int last = pos[oddChar].size() - 1;
        cout << pos[oddChar][last] << " ";
        pos[oddChar].pop_back();
    }
 
    /* Print positions in second half
       of palindrome */
    for (int i=MAX-1; i>=0; i--)
    {
        int count = pos[i].size();
        for (int j=count/2; j


Java
// JAVA program to print original
// positions of characters in a
// String after rearranging and
// forming a palindrome
import java.util.*;
 
class GFG
{
 
// Maximum number of characters
static int MAX = 256;
 
static void printPalindromePos(String str)
{
    // Insert all positions of every
    // character in the given String.
    Vector []pos = new Vector[MAX];
    for (int i = 0; i < MAX; i++)
        pos[i] = new Vector();
    int n = str.length();
    for (int i = 0; i < n; i++)
        pos[str.charAt(i)].add(i + 1);
 
    /* find the number of odd elements.
    Takes O(n) */
    int oddCount = 0;
    char oddChar = 0;
    for (int i = 0; i < MAX; i++)
    {
        if (pos[i].size() % 2 != 0)
        {
            oddCount++;
            oddChar = (char) i;
        }
    }
 
    /* A palindrome cannot contain more than 1
    odd characters */
    if (oddCount > 1)
        System.out.print("NO PALINDROME");
 
    /* Print positions in first half
    of palindrome */
    for (int i = 0; i < MAX; i++)
    {
        int mid = pos[i].size() / 2;
        for (int j = 0; j < mid; j++)
            System.out.print(pos[i].get(j) + " ");
    }
 
    // Consider one instance odd character
    if (oddCount > 0)
    {
        int last = pos[oddChar].size() - 1;
        System.out.print(pos[oddChar].get(last) + " ");
        pos[oddChar].remove(pos[oddChar].size() - 1);
    }
 
    /* Print positions in second half
    of palindrome */
    for (int i = MAX - 1; i >= 0; i--)
    {
        int count = pos[i].size();
        for (int j = count / 2; j < count; j++)
            System.out.print(pos[i].get(j) + " ");
    }
}
 
// Driver code
public static void main(String[] args)
{
    String s = "geeksgk";
    printPalindromePos(s);
}
}
 
// This code is contributed by 29AjayKumar


C#
// C# program to print original
// positions of characters in a
// String after rearranging and
// forming a palindrome
using System;
using System.Collections.Generic;
 
class GFG
{
 
// Maximum number of characters
static int MAX = 256;
 
static void printPalindromePos(String str)
{
    // Insert all positions of every
    // character in the given String.
    List []pos = new List[MAX];
    for (int i = 0; i < MAX; i++)
        pos[i] = new List();
    int n = str.Length;
    for (int i = 0; i < n; i++)
        pos[str[i]].Add(i + 1);
 
    /* find the number of odd elements.
    Takes O(n) */
    int oddCount = 0;
    char oddChar = (char)0;
    for (int i = 0; i < MAX; i++)
    {
        if (pos[i].Count % 2 != 0)
        {
            oddCount++;
            oddChar = (char) i;
        }
    }
 
    /* A palindrome cannot contain more than 1
    odd characters */
    if (oddCount > 1)
        Console.Write("NO PALINDROME");
 
    /* Print positions in first half
    of palindrome */
    for (int i = 0; i < MAX; i++)
    {
        int mid = pos[i].Count / 2;
        for (int j = 0; j < mid; j++)
            Console.Write(pos[i][j] + " ");
    }
 
    // Consider one instance odd character
    if (oddCount > 0)
    {
        int last = pos[oddChar].Count - 1;
        Console.Write(pos[oddChar][last] + " ");
        pos[oddChar].RemoveAt(pos[oddChar].Count - 1);
    }
 
    /* Print positions in second half
    of palindrome */
    for (int i = MAX - 1; i >= 0; i--)
    {
        int count = pos[i].Count;
        for (int j = count / 2; j < count; j++)
            Console.Write(pos[i][j] + " ");
    }
}
 
// Driver code
public static void Main(String[] args)
{
    String s = "geeksgk";
    printPalindromePos(s);
}
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:
2 1 4 5 7 6 3 

时间复杂度: O ( n )