B. Azamon Web Services
题目链接:codeforces 1281 B
题意:
T组测试样例,每组样例给出两个字符串,一个字符串 s ,一个字符串 c ,如果将字符串 s 中的两个字符交换位置(只能交换两个字符或者不交换),如果交换后的字符串 s 小于 c ,输出交换后的字符串 s , 否则输出 ---
解题思路:
将字符串 s 排序,得到最小字典序的串,当逐位比较字符后,如果完全一样,没有必要变,说明此时字符串 s 为字典序最小,如果不同,从后往前找到当前字符,交换即可。
注意:
从后往前而不是从前往后找,因为将当前比较大的字符放到后面比放到前面会更小
举例: ABVAMOAN
从前往后: AAVBMOAN
从后往前: AAVAMOBN (更小)
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
string s, c, t;
cin >> s >> c;
t = s;
sort(t.begin(), t.end()); // 构造字典序最小字符串
int len = s.size();
for(int i = 0; i < len; i++){
if(s[i] != t[i]){ // 如果不相同,说明字符串s可以变小
for(int j = len - 1; j > i; j--){ // 从后往前找
if(s[j] == t[i]){
swap(s[i], s[j]);
break;
}
}
break;
}
}
if(s < c){
cout << s << endl;
}
else{
cout << "---" << endl;
}
}
return 0;
}