【LetMeFly】3174.清除数字:一个不用栈的方法
力扣题目链接:https://leetcode.cn/problems/clear-digits/
给你一个字符串 s
。
你的任务是重复以下操作删除 所有 数字字符:
- 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。
请你返回删除所有数字字符以后剩下的字符串。
示例 1:
输入:s = "abc"
输出:"abc"
解释:
字符串中没有数字。
示例 2:
输入:s = "cb34"
输出:""
解释:
一开始,我们对 s[2]
执行操作,s
变为 "c4"
。
然后对 s[1]
执行操作,s
变为 ""
。
提示:
1 <= s.length <= 100
s
只包含小写英文字母和数字字符。- 输入保证所有数字都可以按以上操作被删除。
解题方法:计数 + 字符串翻转
一个数字可以抵消一个字母,因此使用一个整数 c n t D i g i t cntDigit cntDigit统计数字的个数。
倒着遍历字符串,遇到一个数字 c n t D i g i t cntDigit cntDigit就加一,遇到一个字符就尝试用数字抵消(如果 c n t D i g i t cntDigit cntDigit大于 0 0 0则直接 c n t D i g i t cntDigit cntDigit减一,否则抵消不了,这个字符就需要加到字符串上)。
将字符串reverse,返回即可。
- 时间复杂度 O ( l e n ( s ) ) O(len(s)) O(len(s))
- 空间复杂度:对于可变长字符串的编程语言: O ( 1 ) O(1) O(1),因为力扣返回值不计入算法空间复杂度;对于不可变长字符串的编程语言: O ( l e n ( s ) ) O(len(s)) O(len(s)),可以开辟一个列表用来存放每一个字符串。
AC代码
C++
class Solution {
public:
string clearDigits(string s) {
string ans;
int cntDigit = 0;
for (int i = s.size() - 1; i >= 0; i--) {
if (isdigit(s[i])) {
cntDigit++;
}
else if (cntDigit) {
cntDigit--;
}
else {
ans += s[i];
}
}
reverse(ans.begin(), ans.end());
return ans;
}
};
Go
package main
import "unicode"
func clearDigits(s string) string {
ansList := []rune{}
cntDigit := 0
for i := len(s) - 1; i >= 0; i-- {
if unicode.IsDigit(rune(s[i])) {
cntDigit++
} else if cntDigit > 0 {
cntDigit--
} else {
ansList = append(ansList, rune(s[i]))
}
}
for i := 0; i < len(ansList) / 2; i++ {
ansList[i], ansList[len(ansList) - i - 1] = ansList[len(ansList) - i - 1], ansList[i]
}
return string(ansList)
}
Java
class Solution {
public String clearDigits(String s) {
StringBuilder ans = new StringBuilder();
int cntDigit = 0;
for (int i = s.length() - 1; i >= 0; i--) {
if (Character.isDigit(s.charAt(i))) {
cntDigit++;
}
else if (cntDigit > 0) {
cntDigit--;
}
else {
ans.append(s.charAt(i));
}
}
ans.reverse();
return ans.toString();
}
}
Python
class Solution:
def clearDigits(self, s: str) -> str:
ans = []
cntDigit = 0
for i in range(len(s) - 1, -1, -1):
if s[i].isdigit():
cntDigit += 1
elif cntDigit:
cntDigit -= 1
else:
ans.append(s[i])
return ''.join(reversed(ans))
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/141943628
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » LeetCode 3174.清除数字:一个不用栈的方法
发表评论 取消回复