b_dd_一次交换使字符串字典序最小(思维)

交换一次或不交换一个字符串的两个字母,得到一个字典序最小的字符串(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;
}
posted @ 2021-03-28 17:12  童年の波鞋  阅读(613)  评论(0编辑  收藏  举报