Skip to content

Latest commit

 

History

History
38 lines (32 loc) · 1.3 KB

402. Remove K Digits.md

File metadata and controls

38 lines (32 loc) · 1.3 KB

思路

要求返回的数字最小,其实就是字典序最小,所以类似316. Remove Duplicate Letters:需要尽可能把小数字放在前面,所以需要找到满足 num[i]>num[i+1],然后去掉 num[i],即单调栈。

具体的,维护一个初始为空的最终结果字符串stk,并遍历一遍num: 1)对于当前字符 c,如果stk结尾字符比c大,说明找到了 num[i]>num[i+1],即应该去掉skt结尾字符,并k--,然后继续判断直到不满足; 2)将c加入stk;

注意最后需要处理k还大于0以及前导0。

关键词:单调栈

C++

class Solution {
public:
    string removeKdigits(string num, int k) {
        if(num.size() <= 1) return "0";
        string stk = "";
        for(char c: num){
            while(!stk.empty() && k > 0 && c < stk.back()){
                k--;
                stk.pop_back();
            }
            stk.push_back(c);
        }

        for(int i = 0; i < k; i++) stk.pop_back();
        int lead_0_cnt = 0;
        for(char c: stk){
            if(c != '0') break;
            else lead_0_cnt++;
        }
        return lead_0_cnt == stk.size() ? "0" : stk.substr(lead_0_cnt);
    }
};