2390.从字符串中移除星号
思路:把元素加入栈中,遇到 * 号直接弹出栈顶元素
class Solution {
public:
string removeStars(string s) {
stack<char>st;
for(int i=0;i<s.size();i++){//字符加入栈,遇到星号弹出栈
if(s[i]!='*') st.push(s[i]);
else st.pop();
}
int n=st.size();
for(int i=n-1;i>=0;i--){//把栈中元素倒序赋值给s
char mid=st.top();
s[i]=mid;
st.pop();
}
return s.substr(0,n);//截取s的结果部分
}
};
735.小行星碰撞
分析:只有左边向右,右边向左时,两个星球才会相撞
思路一:使用 vector 模拟栈
遍历数组,当出现两个星球相撞时
- 1.两个星球相等:栈顶弹出
- 2.栈顶的元素大:跳过
- 3.栈顶的元素小:栈顶弹出,当前遍历星球存活,还需要判断下一个栈顶情况
所以,栈顶元素小的情况下,可能当前遍历星球会存活,所以引入 bool 变量记录
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
vector<int>res;
int n=asteroids.size();
for(int it:asteroids){//遍历数组
bool alive=true;//判断当前行星是否存活
while(alive && it<0 && !res.empty() && res.back()>0){
alive=res.back()<-it;//记录当前值大于栈顶值,当前值存活
if(res.back()<=-it) res.pop_back();//弹出较小的栈顶
}
if(alive) res.push_back(it);//当前行星存活,直接加入
}
return res;
}
};
394.字符串解码
思路一:
- 考虑用 pair 把字符串和次数进行组合
- 延迟满足:
- 每一个组合存储:上一次遍历的结果字符,当前字符的次数
- 当遍历到数字时:考虑大于9,需要对上一次存储数字进行*10操作
- 遍历到 ' [ ' 符号时:将上一次结果字符和刚读取的当前字符次数存储到栈中,并且把 num赋值为0,结果字符置空(准备下一次赋值)
- 遍历到 ' ] ' 符号时:将当前字符进行累加(使用栈顶的字符次数),然后再加到栈顶的结果字符后面
- 当遍历到字符时:将字符直接加入结果字符(' [ ' 时已置空)
class Solution {
public:
string decodeString(string s) {
stack<pair<string,int>>st;
int num=0;
string res;
for(char it:s){
if(it>='0' && it<='9') num=num*10+(it-'0');//遍历到数字时
else if(it=='['){//遍历到左括号
st.push(make_pair(res,num));
res="";
num=0;
}
else if(it==']'){//遍历到右括号
string pre=st.top().first;//获取上次的结果字符
int n=st.top().second;//获取当前字符对应的数字
string cur;
for(int i=0;i<n;i++) cur+=res;
res=pre+cur;
st.pop();
}
else res+=it;//遍历到字母
cout<<num<<endl;
}
return res;
}
};