LeetCode:2390. 从字符串移除*号 使用栈,时间复杂度O(N)

2390. 从字符串移除*号

today 2390. 从字符中移除*号

题目表述

给你一个包含若干星号 * 的字符串 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*****”
输出: “”
解释:整个字符串都会被移除,所以返回空字符串。

提示:

  • 1 <= s.length <= 10^5
  • s由小写英文字母和星号*组成
  • s 可以执行上述操作

题目解析

题目要求我们从字符串 s 中移除所有星号,并返回移除星号之后的字符串。

我们可以使用栈来解决这个问题。通过维护一个栈来存储最终结果res,初始时栈为空。我们从前到后遍历字符串 s:

  • 如果遇到星号,我们将栈中的栈顶元素弹出。
  • 如果遇到非星号,我们将其压入栈中。
  • 遍历完成后,栈中的元素即为最终结果。

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),遍历字符串 s 一次。
  • 空间复杂度: O ( n ) O(n) O(n),栈最多存储 n 个元素。

代码实现

Python实现:

class Solution(object):
    def removeStars(self, s):
        stack = []
        for char in s:
            if char == '*':
                stack.pop()  # 移除栈顶元素,即上一个添加的字符
            else:
                stack.append(char)  # 将非 '*' 字符压入栈中
        return ''.join(stack)  # 最后将栈中的字符连接成字符串返回

C++实现:

class Solution {
public:
    string removeStars(string s) {
        string res;
        for (char c : s) {
            if (c == '*') {
                res.pop_back();  // 遇到 '*' 时移除最后一个字符
            } else {
                res.push_back(c);  // 添加非 '*' 的字符
            }
        }
        return res;
    }
};

Go实现:

func removeStars(s string) string {
    // 预先分配切片容量,避免多次动态扩容
    res := make([]byte, 0, len(s)) 
    for i := 0; i < len(s); i++ {
        if s[i] == '*' {
            res = res[:len(res)-1]  // 从切片中移除最后一个元素
        } else {
            res = append(res, s[i])  // 非 '*' 字符加入切片
        }
    }
    return string(res)  // 将最终的 byte 切片转化为字符串
}

你可能感兴趣的:(每日一题,leetcode,linux,算法)