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)