本文承接:
1.单调栈的简单介绍
见<一>
2.单调栈的用法
见<一>
3.leetcode实战
4. leetcode316 去除重复字母
给你一个字符串 s
,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
输入:s = "bcabc"
输出:"abc"
class Solution {
public String removeDuplicateLetters(String s) {
Deque<Character> stack = new ArrayDeque<>();
int[] count = new int[26];
boolean[] flag = new boolean[26];
for(char c : s.toCharArray()){
count[c - 'a']++;
}
for(char c : s.toCharArray()){
count[c - 'a']--;
if(flag[c - 'a']) continue;
while(!stack.isEmpty() && c < stack.peek()){
if(count[stack.peek()-'a'] == 0) break;
flag[stack.pop()-'a'] = false;
}
stack.push(c);
flag[c-'a'] = true;
}
StringBuilder str = new StringBuilder();
while(!stack.isEmpty()){
str.append(stack.pop());
}
return str.reverse().toString();
}
}
本题小结:(1)boolean[]数组用来去重
(2)int[] count数组用来计数,一直到存储容量为0则进行操作
(3)单调递增栈,底下小,上面大,弹出时,大在前,小在后,再reverse()一下
5. leetcode402 移掉k位数字
给你一个以字符串表示的非负整数 num
和一个整数 k
,移除这个数中的 k
位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
输入:num = "1432219", k = 3
输出ÿ