Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

Note:

  • The length of num is less than 10002 and will be ≥ k.
  • The given num does not contain any leading zero.

Example 1:

Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2:

Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

Example 3:

Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.

Subscribe to see which companies asked this question.

Hide Tags
  Stack Greedy
Show Similar Problems
<form action="https&#58;&#47;&#47;leetcode&#46;com&#47;interviewed&#47;" id="interviewed&#45;form" method="post" style="color&#58;rgb&#40;51&#44;51&#44;51&#41;&#59;font&#45;family&#58;&#39;Helvetica Neue&#39;&#44; Helvetica&#44; Arial&#44; sans&#45;serif&#59;font&#45;size&#58;12&#46;6px&#59;"> </form>

题意:从一个字符串中删除k个字母,使得剩余的数字最小

注意,如果将0前面的数字删除,已相当于删除了0

举个例子 1070934 k=2

由于刚刚说的这个问题,导致我傻乎乎的想用结构体{原来位置,以0分割的数字}来存储

然鹅……并不需要……

看到标签中有“栈”就想到一定是单调栈的应用,开始想到用在单调栈存储答案,后来又想到用单调栈存储不要的字符……反正就是卡在了0的处理上,之前的做法实现太tm的难了

我们来想一想“单调栈”是啥,维护一个单调的集合,后进先出

对于这个题来说呢,恰好就能解决0的处理问题,因为要是遇到0就把之前的都弹出去了啊!最终的集合中只有前面有0,特殊处理一下就好啦

还是上一个例子:

最终在栈中的是00934,完美的解决了以0分割的问题,因为0出现一定会把前面的非0数字挤出去,然后0剩在栈中,还不算删掉的数字个数里面

牵强的想想为啥这么做

如果删除数字,一定是会优先选择前面&&大的数字,前面&&小的数字是要保留下来的,所以想到是单调栈维护;

想到00934的“0”其实是没有被删除的,所以也不用真的把它删除掉,留到最后就好啦

class Solution {
public:
    string removeKdigits(string num, int k) {
        string ans;
        int n=k,len=num.size();
        for(auto val:num)
        {
            while(n>0&&!ans.empty()&&val<ans.back())
            {
                n--;
                ans.pop_back();
            }
            ans.push_back(val);
        }
        int pos=0;
        while(ans[pos]=='0') pos++;
        if(pos==len-k||k==len)return "0";
        else
        {
            ans=string(ans,pos,len-k-pos);
            return ans;
        }
    }
};