【题解】最大字符串
题意
有两个字符串和
,能否只交换字符串
中的两个字符或者不交换,就使得
的字典序严格大于
。若可以输出交换后的
,否则输出
。
题解
我们复制一个串的副本为
,对
串进行从大到小字符排序。怎么样能使
串仅交换一次就能变得尽可能大呢,我们贪心的考虑,用
串和
串进行比较,由于
是是经过排序后字典序已经最大的串了,然后
串和
串第一个不同的位置,去交换
串中这两个字符就能使
串尽可能大。那么我们去
串中找另一个字符时,需要从后往前找,这样能保证交换的字符串是较大的一个。例如:
从前往后交换的话串就变为
,这显然比从后往前交换的
要小。
复杂度
时间复杂度即排序
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
string a,b;
cin>>a>>b;
string c=a;
sort(c.begin(),c.end(),greater<char>());
for(int i=0; i<a.length(); i++)
if(a[i]!=c[i])
{
for(int j=a.length(); j>=0; j--)
if(a[j]==c[i])
{
swap(a[j],a[i]);
break;
}
break;
}
if(a>b)
cout<<a<<endl;
else
cout<<b<<endl;
}
return 0;
}