习题-字典序最大的子序列(贪心)

习题-字典序最大的子序列

#include <bits/stdc++.h>
using namespace std;

string res;

signed main(){
    string s; cin >> s;
    for(int i = 0; i < s.size(); ++i){
        while(res.size() && res.back() < s[i]) res.pop_back();
        res += s[i];
    }
    
    cout << res << endl;

    return 0;
}

逆序遍历,分三种情况最后一个字母是最大的就是答案,最后一个字母是最小的,也是边界答案以增加长度,最后一个字母既不是最大也不是最小,在逆序遍历的时候把它放在最大的前面(最后还要翻转),比它小的不是答案

#include <bits/stdc++.h>
using namespace std;

string res;

signed main(){
    string s; cin >> s;
    res += s[s.size() - 1];
//     cout << res 
    for(int i = s.size() - 2, j = 0; i >= 0; --i){
        if(res[j] <= s[i]) res += s[i], ++j;
    }
    reverse(res.begin(), res.end());
    cout << res << endl;
    
    return 0;
}
posted @ 2025-03-27 11:48  awei040519  阅读(20)  评论(0)    收藏  举报