題目描述
??給你一個包含若干星號 * 的字符串 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();}