目录
题目:
示例:
分析:
代码+运行结果:
题目:
示例:
分析:
题目给我们一个字符串,然后字符串中包含星号*,要求每个星号消除一个从星号左边起最近的一个字符,返回消除后的字符串。
首先每个星号*要消除从左开始的第一个字符,并且自身也被移除,这不免让我们想到先进后出,后进先出这个概念,因此我们自然而然就可以想到使用栈来解决这道题。
一开始我使用的是C++内置的stack(栈)这个容器后,由于我们返回的结果还是需要按照正常的顺序排列的字符串,而一个个将字符从栈中取出则是相反的顺序,如果要正常排列,还需要加一道工序,因此我们可以使用vector来模拟栈,并且取结果的时候也可以从左到右自然地取出。
我们先遍历一边原字符串,然后在遇到非星号的字符则直接入栈,遇到星号时不仅不入栈,还需要将栈顶元素弹出表示星号消除掉了一个从左开始第一个字符。(由于题目保证了测试用例可以保证一个星号消除一个字符,因此我们不需要判断栈是否为空这种问题,不过代码中有习惯性做个判断,实际上是可以删掉的)
代码+运行结果:
class Solution {
public:
string removeStars(string s) {
//使用C++自带的stack栈的话,由于栈的先进后出的特殊性,会导致需要单独处理结果的顺序
//使用vector模拟stack
vector<char>stack;
for(char S:s){
if(stack.empty()||S!='*') stack.push_back(S); //如果栈为空或者元素不为*则入栈
//由于题目保证合法操作(即一个*会消除一个字符)因此实际上else if可以改成else,并且上面的if也不需要判断栈是否不为空
else if(!stack.empty()) stack.pop_back(); //如果为*,不仅不入栈,并且要弹出一个最后进入的元素
}
string res="";
for(const char &S:stack){
res+=S;
}
return res;
}
};