首页 文章资讯内容详情

如果可能,在 C++ 中重新排列字符以形成回文

2026-06-02 1 花语

我们得到了一个任意给定长度的字符串“str”。任务是以这样一种方式重新排列字符,即输出将是回文字符串,而无需从给定的输入字符串中添加或删除字符。回文字符串是这样一种字符串,其中字符的排列方式使它们从头到尾发音相同。

让我们看看这个的各种输入输出场景-

输入 -字符串str="itnin"

输出 -如果可能,重新排列字符以形成回文是:nitin

说明 -我们给定了一个字符串类型变量,比如说,str。现在我们将重新排列输入字符串的字符,使其成为回文字符串,如果不可能,则返回“NOTPOSSIBLE”。所以给定输入字符串的输出是nitin。

输入 -字符串str="baaaba"

输出 -如果可能,重新排列字符以形成回文是:aabbaa

说明-我们给定了一个字符串类型变量,比如说,str。现在我们将重新排列输入字符串的字符,使其成为回文字符串,如果不可能,则返回“NOTPOSSIBLE”。所以给定输入字符串的输出是aabbaa。

下面程序中使用的方法如下

输入一个字符串类型的变量,比如str并计算字符串的大小并将其存储在一个名为变量的长度中。

将数据传递给函数Rearrangement(str,length)。

函数内部Rearrangement(arr,length)

创建一个变量作为unordered_map类型的“um”,用于存储字符和整数类型对。

将整数类型变量声明为total并将其设置为0。

将字符类型变量创建为ch,将字符串类型变量创建为str_1和str_2。

从i到0开始循环FOR,直到i小于长度。在循环内,将um[str[i]]设置为增量值1。

开始循环FOR以迭代映射“嗯”。在循环内,检查IFit.second%2不等于0然后将总数增加1并用it.first设置ch。

检查IFtotal大于1ORtotal=1ANDlength%2=0然后返回0。

开始循环FOR以迭代映射“嗯”。在循环内,将str(it.second/2,it.first)、str_1设置为str_1+str并将str_2设置为str+str_2。

检查IFtotal=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(str, length); return 0; }输出结果

如果我们运行上面的代码,它将生成以下输出

如果可能,重新排列字符以形成回文是: nitin