402. Remove K Digits

402. Remove K Digits

Description

Difficulty: Medium

Related Topics: String, Stack, Greedy, Monotonic Stack

Given string num representing a non-negative integer num, and an integer k, return the smallest possible integer after removing k digits from num.

Example 1:

1
2
3
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:

1
2
3
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:

1
2
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.

Constraints:

  • 1 <= k <= num.length <= 105
  • num consists of only digits.
  • num does not have any leading zeros except for the zero itself.

Hints/Notes

  • two pass, first make it monotonic, then remove extra tail elements

Solution

Language: C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public:
    string removeKdigits(string num, int k) {
        if (num.size() <= k) {
            return "0";
        }
        int removed = 0;
        stack<char> s;
        for (int i = 0; i < num.size(); i++) {
            while (!s.empty() && (s.top() > num[i]) && removed < k) {
                s.pop();
                removed++;
            }
            if (s.empty() && num[i] == '0') {
                continue;
            }
            s.push(num[i]);
        }
        while (k > removed && !s.empty()) {
            s.pop();
            removed++;
        }
        if (s.empty()) {
            return "0";
        }
        string res;
        while (!s.empty()) {
            res.push_back(s.top());
            s.pop();
        }
        reverse(res.begin(), res.end());
        
        return res;
    }
};