LeetCode 75 part 06 栈

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;
    }
};

猜你喜欢

转载自blog.csdn.net/Ricardo_XIAOHAO/article/details/133363811
今日推荐