交换一次或不交换一个字符串的两个字母,得到一个字典序最小的字符串(n<1e5)
思路:O(26×n)的做法,顺序遍历s,如果存在一个字符j在s[i]后面,且比s[i]要小的话,此时交换,得到的串的字典序最小
#include<bits/stdc++.h>
using namespace std;
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
string s; cin>>s;
int n=s.size();
unordered_map<char, int> mp;
for (int i=0; i<n; i++) mp[s[i]]=i;
for (int i=0; i<n; i++) {
for (char j='a'; j<s[i]; j++) {
if (mp.find(j) != mp.end() && mp[j]>i) {
int idx=mp[j];
swap(s[idx], s[i]);
cout<<s;
return 0;
}
}
}
return 0;
}