思路
字典序小的字母要尽量放在前面,要确保唯一性。
当当前字符比栈顶元素小的时候,并且栈顶元素在后续出现过,则把当前栈点元素弹出。为了记录字符在后面是否会出现,可以先遍历字符串,以一个<字符,下标>的map来存储字符,根据map同样key,value会被后添加的元素覆盖的特性,来看字符在后续是否会出现。
代码
import java.util.HashMap;
import java.util.Stack;
class Solution {
public String removeDuplicateLetters(String s) {
HashMap<Character, Integer> map = new HashMap<>();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), i);
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (stack.contains(c)) continue;
while (!stack.isEmpty() && c < stack.peek() && map.get(stack.peek()) > i) {
stack.pop();
}
stack.push(c);
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
总结
1.单调栈能解决的问题:
下一个更大元素、或下一个更小元素。
2.单调栈的常见代码模板:
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
while (!stack.isEmpty() && c < stack.peek()) {
stack.pop();
}
stack.push(c);
}
栈中的元素可以直接是原数组的元素,或者是数组的下标。
3.这个题目的难点是想到不重复的字母、即唯一性怎么解决。
以及元素在后面出现是如何处理的。
标签
单调栈