跳转至

3174. 清除数字

题目描述

给你一个字符串 s 。

你的任务是重复以下操作删除 所有 数字字符:

  • 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。

请你返回删除所有数字字符以后剩下的字符串。

 

示例 1:

输入:s = "abc"

输出:"abc"

解释:

字符串中没有数字。

示例 2:

输入:s = "cb34"

输出:""

解释:

一开始,我们对 s[2] 执行操作,s 变为 "c4" 。

然后对 s[1] 执行操作,s 变为 "" 。

 

提示:

  • 1 <= s.length <= 100
  • s 只包含小写英文字母和数字字符。
  • 输入保证所有数字都可以按以上操作被删除。

解法

方法一:栈 + 模拟

我们用一个栈 stk 来模拟这个过程,遍历字符串 s,如果当前字符是数字,就弹出栈顶元素,否则将当前字符入栈。

最后将栈中的元素拼接成字符串返回。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 s 的长度。

1
2
3
4
5
6
7
8
9
class Solution:
    def clearDigits(self, s: str) -> str:
        stk = []
        for c in s:
            if c.isdigit():
                stk.pop()
            else:
                stk.append(c)
        return "".join(stk)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution {
    public String clearDigits(String s) {
        StringBuilder stk = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                stk.deleteCharAt(stk.length() - 1);
            } else {
                stk.append(c);
            }
        }
        return stk.toString();
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Solution {
public:
    string clearDigits(string s) {
        string stk;
        for (char c : s) {
            if (isdigit(c)) {
                stk.pop_back();
            } else {
                stk.push_back(c);
            }
        }
        return stk;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func clearDigits(s string) string {
    stk := []byte{}
    for i := range s {
        if s[i] >= '0' && s[i] <= '9' {
            stk = stk[:len(stk)-1]
        } else {
            stk = append(stk, s[i])
        }
    }
    return string(stk)
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function clearDigits(s: string): string {
    const stk: string[] = [];
    for (const c of s) {
        if (!isNaN(parseInt(c))) {
            stk.pop();
        } else {
            stk.push(c);
        }
    }
    return stk.join('');
}

评论