打印字符的排列位置以制作回文
你得到一个长度为 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 )