题目:
给你一个字符串 s
。你的任务是重复以下操作删除 所有 数字字符:
- 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。
请你返回删除所有数字字符以后剩下的字符串。
示例 1:
输入:s = “abc”
输出:“abc”
解释:
字符串中没有数字。
示例 2:
输入:s = “cb34”
输出:””
解释:
一开始,我们对 s[2]
执行操作,s
变为 "c4"
。
然后对 s[1]
执行操作,s
变为 ""
。
提示:
1 <= s.length <= 100
s
只包含小写英文字母和数字字符。- 输入保证所有数字都可以按以上操作被删除。
思路:
由于要删除每个数字字符及其左边第一个非数字字符。那么相当于先找数字字符,在找左边的字母
所以需要从右往左遍历,每次找到一个数字字符,就匹配其左边最近的字母
那么就需要记录每个数字字符,用栈实现即可
从右往左遍历,
遇到数字字符就入栈
每次遇到字母,如果栈内有元素,那么这个字母就要被删除
如果栈内没有元素,这个字母就会被保留
代码:
class Solution {
public:
string clearDigits(string s) {
stack<char> stk;
for (int i = s.size() - 1; i >= 0; i--) {
if (s[i] >= '0' && s[i] <= '9') {
// 数字字符,直接入栈
stk.push(s[i]);
}else if (stk.size() > 0){
stk.pop();
s[i] = '-';
}
}
string ans = "";
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') continue;
if (s[i] == '-') continue;
ans += s[i];
}
return ans;
}
};