习题-字典序最大的子序列(贪心)
#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;
}

浙公网安备 33010602011771号