本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。
💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识
专题一
- 题目来源
- 题目描述
- 算法原理
- 方法一:栈
- 代码实现
- 方法二:递归
- 代码实现
题目来源
本题来源为:
清楚数字
题目描述
给你一个字符串 s 。
你的任务是重复以下操作删除 所有 数字字符:
删除 第一个数字字符 以及它左边 最近 的 非数字 字符。
请你返回删除所有数字字符以后剩下的字符串。
算法原理
方法一:栈
根据题意,我们可以使用栈来模拟所有操作。首先遍历字符串 s,令当前访问的字符为 c,有两种情况:
-
c 为数字,那么我们将栈顶字符弹出。
-
c 不为数字,那么我们将 c 压入栈中。
最后返回栈中自底向上的所有字符组成的字符串为结果。
代码实现
class Solution
{
public:
string clearDigits(string s)
{
string res;
for(char c:s)
{
if(isdigit(c))
{
//出栈
res.pop_back();
}
else
{
//入栈
res.push_back(c);
}
}
return res;
}
};
其中isdigit是一个函数,他的功能如下:
检查 c 是否为十进制字符。
十进制数字是以下任意数字: 0 1 2 3 4 5 6 7 8 9
方法二:递归
代码实现
class Solution
{
public:
string clearDigits(string s)
{
//递归
int n=s.size();
for(int i=0;i<n;i++)
{
int d=s[i]-'0';
if(d>=0&&d<=9)
{
s.erase(s.begin()+i-1,s.begin()+i+1);
return clearDigits(s);
}
}
//递归出口
return s;
}
};