https://leetcode.com/problems/remove-k-digits/
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.
一开始想的方法是,先处理前驱零的情况(因为一旦能够出现前驱零,就意味着结果的位数会更少,必然是最优解),然后再处理后半部分的平凡情况,处理的方法是dfs,然后果不其然TLE了
看了正规做法,其实是利用单调栈的思想,证明也很容易,利用反证法,如果不按照单调栈的想法将这些值pop出去,那么最后的结果中对应位必然比单调栈操作后的对应位要大,所以必然不是最优解(这种思想下在比较时不用对零特殊处理,只需要在push进去的时候处理一下防止前驱零就可以了)。利用的是字符串比较时仅针对前驱大小的局部性
class Solution {
public:
string removeKdigits(string num, int k) {
string result = "";
for(char cha : num){
while(!result.empty() && k != 0 && cha < result.back()){
result.pop_back();
--k;
}
if(!result.empty() || cha != '0') result.push_back(cha);
}
while(!result.empty() && k != 0){
result.pop_back();
--k;
}
if(result == "") return "0";
else return result;
}
};