https://leetcode.com/problems/remove-k-digits/description/
如果直接用DFS做的话轻轻松松就会stack overflow。
这道题可以用贪心法,题目换个思路说就是尽可能保证得到的数字是递增的。在拿到一个新数字时,尽可能(只要还能删)把该数字之前的比它大的数字移掉。
贪心法之所以能用是因为我们去尽量保证了a1<a2< …< x< y,如果这些个数字里要选一个删掉的话,肯定是删掉y带来的结果最好。
class Solution { public: string removeKdigits(string num, int k) { const int digits = num.size() - k; char* stack = new char[num.size()]; // mem leak but I DONT CARE! int top = 0; for (int i = 0; i < num.size(); ++i) { char c = num[i]; while (top > 0 && stack[top-1] > c && k > 0) { top--; k--; } stack[top++] = c; } int idx = 0; while (idx < digits && stack[idx] == '0') idx++; return idx == digits ? "0" : string(stack + idx, digits - idx); } };