3174、清除数字
3174、[简单] 清除数字
1、题目描述
给你一个字符串 s
。你的任务是重复以下操作删除 所有 数字字符:
- 删除 第一个数字字符 以及它左边 最近 的 非数字 字符。
请你返回删除所有数字字符以后剩下的字符串。
2、解题思路
-
遍历字符串:
- 我们需要逐个遍历字符串中的每个字符,找到数字字符,并删除其左侧最近的非数字字符。
-
双指针法:
- 我们可以使用两个指针 left 和 right 来实现遍历和删除的过程:
right
用于遍历字符串s
;left
用于构造删除后的新字符串,逐步替换字符。
- 我们可以使用两个指针 left 和 right 来实现遍历和删除的过程:
-
处理逻辑:
-
当我们遇到一个数字字符时,删除左侧最近的非数字字符,这可以通过将
left
指针左移一位实现。 -
当遇到非数字字符时,将其放到新的位置上,并移动
left
指针。
-
-
最后清理字符串:
- 遍历结束后,使用
erase
函数删除字符串中多余的字符,最终得到所需结果。
- 遍历结束后,使用
3、代码实现
class Solution {
public:
string clearDigits(string s) {
int n = s.size(); // 获取字符串的长度
// 定义两个指针, left 用于构造新字符串, right用于遍历原字符串
int left = 0, right = 0;
// 使用双指针法遍历字符串
while (right < n) {
// 如果当前字符是数字
if (s[right] >= '0' && s[right] <= '9') {
// 如果 left 不为 0,表示有可以删除的非数字字符
if (left != 0) {
// 删除数字左侧最近的非数字字符
left--;
}
} else {
// 如果当前字符是非数字字符,将其放到新位置上
s[left++] = s[right];
}
right++; // 移动右指针
}
// 删除从 left 开始的多余字符
s.erase(left);
// 返回处理后的字符串
return s;
}
};
4、复杂度分析
-
时间复杂度:O(n),其中
n
是字符串的长度。我们只遍历字符串一次。 -
空间复杂度:O(1),只使用了常数级别的额外空间来存储指针。
5、总结
这个问题通过双指针法实现对字符串的遍历和处理,核心在于如何高效地删除数字字符及其左侧相邻的非数字字符。通过对指针的巧妙控制,我们能够在一次遍历中完成所有操作,并且不需要额外的空间复杂度。