题解 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;
}
posted @   HappyBobb  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示