Skip to content

2390. 从字符串中移除星号 Medium

给你一个包含若干星号 * 的字符串 s 。

在一步操作中,你可以:

  • 选中 s 中的一个星号。
  • 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。
  • 返回移除 所有 星号之后的字符串。

注意:

  • 生成的输入保证总是可以执行题面中描述的操作。
  • 可以证明结果字符串是唯一的。

示例 1:
输入:s = "leet**cod*e"
输出:"lecoe"
解释:从左到右执行移除操作:

  • 距离第 1 个星号最近的字符是 "leet**code" 中的 't' ,s 变为 "leecod*e" 。
  • 距离第 2 个星号最近的字符是 "leecode" 中的 'e' ,s 变为 "lecod*e" 。
  • 距离第 3 个星号最近的字符是 "lecod*e" 中的 'd' ,s 变为 "lecoe" 。
    不存在其他星号,返回 "lecoe" 。

示例 2:
输入:s = "erase*****"
输出:""
解释:整个字符串都会被移除,所以返回空字符串。

解题思路

输入:一个包含 * 号的字符串 s输出:返回移除所有星号后的字符串,要求移除星号的同时还要移除左侧最近那个非星号字符

本题属于 基础栈 问题。

我们用一个栈 stack 保存最终结果,遍历字符串的同时遇到非星号就存进 stack,遇到星号就弹出最后一个字符。

最终拼接 stack 可以得到结果。

代码实现

python
class Solution:
    def removeStars(self, s: str) -> str:
        stack = []  # 用栈保存最终字符结果

        # 遍历字符串中的每个字符
        for c in s:
            if c == '*':
                # 星号代表删除前一个字符,弹出栈顶
                if stack:
                    stack.pop()
            else:
                # 普通字符压入栈
                stack.append(c)
        
        # 最终栈中剩下的字符拼接成结果字符串
        return ''.join(stack)
javascript
const removeStars = function(s) {
    const stack = [];

    for (let c of s) {
        if (c == '*') {
            stack.pop();
        } else {
            stack.push(c)
        }
    }

    return stack.join('');
};

复杂度分析

时间复杂度:O(n)

空间复杂度:O(n)

链接

2390 国际版

2390 中文版