classSolution(object):defremoveKdigits(self, num, k):
stack =[]
remain =len(num)- k
for digit in num:while k and stack and stack[-1]> digit:
stack.pop()
k -=1
stack.append(digit)return''.join(stack[:remain]).lstrip('0')or'0'
去除重复字母(困难
classSolution:defremoveDuplicateLetters(self, s)->int:
stack =[]
remain_counter = collections.Counter(s)for c in s:if c notin stack:while stack and c < stack[-1]and remain_counter[stack[-1]]>0:
stack.pop()
stack.append(c)
remain_counter[c]-=1return''.join(stack)
拼接最大数(困难)
classSolution:defmaxNumber(self, nums1, nums2, k):defpick_max(nums, k):
stack =[]
drop =len(nums)- k
for num in nums:while drop and stack and stack[-1]< num:
stack.pop()
drop -=1
stack.append(num)return stack[:k]defmerge(A, B):
ans =[]while A or B:
bigger = A if A > B else B
ans.append(bigger[0])
bigger.pop(0)return ans
returnmax(merge(pick_max(nums1, i), pick_max(nums2, k-i))for i inrange(k+1)if i <=len(nums1)and k-i <=len(nums2))