题目如下
数据范围
本题可以利用贪心来做,显然我们的目标是使得结果串尽量小, 当两个字符串长度相等时靠前的字符越小整个串越小。
例如"1243" k = 1删除4就行,因为剩下的串长度为3最小的自然是 "123" 。
从这里我们可以感觉到其实我们是要让结果串呈现一种递增的态势这样可以保证是所有结果串中最小的。
那么我们可以维持一个递增序列,这个序列就用来保存需要作为答案的下标。显然可以用单调栈来获得这样的序列。
!注意:当题目给出的原本就是递增的只要删除后面k个即可例如: "12345" k = 1 删除5就可以得到最优解。
通过代码
cpp
class Solution {
public:
string removeKdigits(string num, int k) {
string ans = "";
int n = num.size();
if(n <= k)return "0";
unordered_set<int> set;
stack<int> s;
for(int i = 0;i < n;i++){
while(!s.empty() && num[s.top()] > num[i]){
if(k == 0)break;
set.insert(s.top());
s.pop();
k--;
}
s.push(i);
}
for(int i = 0;i < k;i++){
set.insert(s.top());
s.pop();
}
for(int i = 0;i < n;i++){
if(!set.contains(i)){
if(num[i] == '0' && ans.size() == 0)continue;
ans += num[i] ;
}
}
if(ans.size() == 0)return "0";
return ans;//时间复杂度On
}
};
![](https://i-blog.csdnimg.cn/direct/7bbfbb11e8c248f1ba5335fdfd036eb2.png)