解题思路
1.根据题意模拟,字符串s每增加一个元素算出其最大字典序子序列,新增元素与ans中元素对比,寻找s[i]第一次大于ans[j]的位置,新的ans等于ans.substr(0, j) + s[i];
代码
#include <bits/stdc++.h> using namespace std; int main(){ string s; while(cin >> s){ string ans; ans += s[0]; for(int i = 1; i < s.size(); i++){ //模拟寻找最大字典序子序列过程 int j = 0; for(; j < ans.size(); j++){ //寻找s[i]第一次大于ans[j]的位置 if(s[i] > ans[j]) break; } ans = ans.substr(0, j) + s[i]; //每增加一个元素生成对应的最大字典序子序列 } cout << ans << endl; } return 0; }
逆序遍历,遇到比目标字符小的字符将其删除
#include <bits/stdc++.h> using namespace std; int main(){ string s; while(cin >> s){ string ans; unordered_set<int> st; //保存需要删除的字符位置 int n = s.size(); char t = s[n-1]; for(int i = n - 2; i >= 0; i--){ //逆序遍历 if(s[i] >= t){ t = s[i]; } else{ //小于t的字符需要删除,以保证留下的字符串为字典序最大序列 st.insert(i); } } for(int i = 0; i < n; i++){ if(st.count(i) == 0) ans += s[i]; } cout << ans << endl; } return 0; }