leetcodeT3170
题目:
算法分析:
单调栈 + 排序应用
考察删除*和其前面的最小字典的字符,要使得剩余的字符字典序最小,考虑删除的字符的位置: 假设删除的字符为c
1.如果删除最前面的c 整体的字符串字典序应该最大
2. 如果删除最后面的c 整体的字符串字典序最大
因此算法的整体思路:
从左到右遍历 s,用 26 个栈记录遍历过的每种字母的下标。
遇到 *,弹出最小字母栈(第一个非空栈)的栈顶。
最后把剩余下标对应的字母按顺序串起来,即为答案。
代码:
class Solution {public String clearStars(String s) {// 建立26个栈List<Integer>[] stks = new ArrayList[26];Arrays.setAll(stks, i -> new ArrayList<>());int n = s.length();for(int i = 0; i < n; i++) {char c = s.charAt(i);if(c != '*') {stks[c - 'a'].add(i);} else {for(List<Integer> stk: stks) {if(!stk.isEmpty()) {stk.removeLast();break;}} }}List<Integer> idx = new ArrayList<>();for(List<Integer> stk: stks) {idx.addAll(stk);}Collections.sort(idx);StringBuilder sb = new StringBuilder();for(int i: idx) {sb.append(s.charAt(i));}return sb.toString();}
}