题目描述
给你一个包含若干星号 * 的字符串 s 。在一步操作中,你可以:选中 s 中的一个星号。移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。返回移除 所有 星号之后的字符串。注意:生成的输入保证总是可以执行题面中描述的操作。可以证明结果字符串是唯一的。
解析
虽然这题是栈的类别,但实际上不需要使用栈,而且不是很难。由于确定前面一定有可以删除的,所以可以直接从后往前遍历,会更快一点。
public String removeStars(String s) {StringBuilder res = new StringBuilder();int starCount = 0;for (int i = s.length() - 1; i >= 0; i--) {char c = s.charAt(i);if (c == '*') {starCount++;} else if (starCount > 0) {starCount--;} else {res.append(c);}}return res.reverse().toString();}
把栈的解法也贴出来:
public String removeStars(String s) {Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '*') {if (!stack.isEmpty()) {stack.pop();}} else {stack.push(c);}}StringBuilder stringBuilder = new StringBuilder();while (!stack.isEmpty()) {stringBuilder.append(stack.pop());}stringBuilder.reverse();return stringBuilder.toString();}