如果可能,在C++中重新排列字符以形成回文
给定任意长度的字符串“str”。任务是重新排列字符,使其成为回文字符串,无需添加或删除输入字符串中的任何字符。回文字符串是指字符排列方式从头到尾读音相同的字符串。
让我们看看各种输入输出场景:
输入 - 字符串 str = "itnin"
输出 - 如果可能,重新排列字符以形成回文是:nitin
解释 - 给定一个字符串类型变量,例如str。现在我们将重新排列输入字符串的字符,使其成为回文字符串;如果不可能,则返回“不可能”。因此,给定输入字符串的输出是“nitin”。
输入 - 字符串 str = "baaaba"
输出 - 如果可能,重新排列字符以形成回文是:aabbaa
解释 - 给定一个字符串类型变量,例如str。现在我们将重新排列输入字符串的字符,使其成为回文字符串;如果不可能,则返回“不可能”。因此,给定输入字符串的输出是“aabbaa”。
下面程序中使用的方法如下:
输入一个字符串类型的变量,例如str,计算字符串的大小并将其存储在一个名为length的变量中。
将数据传递给函数Rearrangement(str, length)。
在函数Rearrangement(arr, length)内部:
创建一个名为“um”的无序映射变量,它存储字符和整数类型的键值对。
声明一个整数类型的变量为total,并将其设置为0。
创建一个字符类型的变量为‘ch’,和字符串类型的变量为str_1和str_2。
从i=0开始循环,直到i小于length。在循环内,将um[str[i]]递增1。
开始循环遍历映射‘um’。在循环内,检查IF it.second % 2 不等于0,则将total加1,并将ch设置为it.first。
检查IF total大于1,或者total = 1且length % 2 = 0,则返回0。
开始循环遍历映射‘um’。在循环内,设置str(it.second / 2, it.first),str_1为str_1 + str,str_2为str + str_2。
检查IF total = 1,则返回str_1 + ch + str_2。否则,返回str_1 + str_2。
打印结果。
示例
#include <bits/stdc++.h>
using namespace std;
string Rearrangement(string str, int length){
unordered_map<char, int> um;
int total = 0;
char ch;
string str_1 = "";
string str_2 = "";
for (int i = 0; i < length; i++){
um[str[i]]++;
}
for(auto it : um){
if(it.second % 2 != 0){
total++;
ch = it.first;
}
}
if(total > 1 || total == 1 && length % 2 == 0){
return 0;
}
for(auto it : um){
string str(it.second / 2, it.first);
str_1 = str_1 + str;
str_2 = str + str_2;
}
if(total == 1){
return str_1 + ch + str_2;
}
else{
return str_1 + str_2;
}
}
int main(){
string str = "itnin";
int length = str.size();
cout<<"Rearrangement of characters to form palindrome if possible is: "<<Rearrangement(str, length);
return 0;
}输出
如果运行以上代码,将生成以下输出
Rearrangement of characters to form palindrome if possible is: nitin
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C编程
C++
C#
MongoDB
MySQL
Javascript
PHP