题解 CF1093B 【Letters Rearranging】
我这个写法可能跟大家有些不同
我是这样想的
每次读入的这个字符串先判断是否是回文,如果是,那么直接输出,所以我构造了一个回文函数:
bool huiwen(string x)
{
string y = x;
reverse(y.begin(), y.end());//翻转
return y == x;
}
但如果不是呢,想想看,可以往后找对吧?但如果往后找找不到呢?对,要往前找,但这样一会往后一会往前的,很麻烦对吧?
STL大法!先把字符串从小到大排一遍:
sort(s.begin(), s.end());
那么然后呢?怎么往后找,在STL的algorithm中有个叫:
next_permutation()
的函数!
这个函数可以做全序列的题目,详见P1706,想做的可以去做做。每调用一次该函数,数组或STL容器会变成下一字典序,可以把全部序列枚举一遍,当该序列为最后一个序列,返回false,否则返回true。
因此,代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
bool huiwen(string x)
{
string y = x;
reverse(y.begin(), y.end());
return y == x;
}
string s;
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> s;
if(!huiwen(s))
{
cout << s << endl;
}
else
{
sort(s.begin(), s.end());
if(!huiwen(s))//要先判断一次!while循环一开始就变成下一字典序了。
{
cout << s << endl;
continue;
}
else
{
while(next_permutation(s.begin(), s.end()))
{
if(!huiwen(s))//如果现在不是回文序列,就输出并且退出循环
{
cout << s << endl;
break;
}
}
}
cout << "-1\n";//找不到-1
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】