1 条题解
-
0
密码
思路与复杂度
提取数字后维护单调栈,遇到更大的数字时删除较小的栈顶;最后删除剩余配额个尾部数字。严格删除 k 个并保留前导零。每个字符最多入栈、出栈一次,时间 O(|s|),空间 O(|s|)。
正确性与边界
每次删除首个可改善的位置能让字典序的最早差异变大;若不存在可改善位置,则删尾部。注意全部相同数字和 k=0。
参考代码
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);string s,st;int k;cin>>s>>k;for(char c:s)if(isdigit((unsigned char)c)){while(k&&!st.empty()&&st.back()<c)st.pop_back(),--k;st+=c;}while(k--)st.pop_back();cout<<st<<"\n";}
- 1