力扣每日一题:1190. 反转每对括号间的子串(栈|字符串)

145 阅读1分钟

1190. 反转每对括号间的子串

分类:

栈 中等

题目:

1190_1.PNG

收获:

  • auto在for中的应用
  • reverse()方法对于迭代器类型的数据反转

复杂度:

1190_3.PNG

1190_2.PNG

代码:

不断进行出栈翻转入栈操作的方式,如果遇到左括号就将当前字符串入栈,并对于其内部就重新记录。

如果遇到右括号就将字符串反转并且和栈顶字符串相结合,如果为普通元素就加在临时字符串后面。

class Solution {
public:
    string reverseParentheses(string s) {
        stack<string> S;
        string tmp="";
        for(auto &ch:s){
            if(ch=='('){
                S.push(tmp);
                tmp="";
            }else if(ch==')'){
                reverse(tmp.begin(),tmp.end());
                tmp=S.top()+tmp;
                S.pop();
            }else{
                tmp+=ch;
            }
        }
        return tmp;
    }
};

首先记录左右括号的位置,随后设置如果碰到括号中的一个就改变方向来读取,非常巧妙

class Solution {
public:
    string reverseParentheses(string s) {
        stack<int> S;
        int n = s.length();
        vector<int> record(n);
        for(int i=0;i<n;i++){
            if(s[i]=='('){
                S.push(i);
            }else if(s[i]==')'){
                int j=S.top();
                S.pop();
                record[i]=j;record[j]=i;
            }
        }
        string result="";
        int index=0;
        int dir=1;
        while(index<n){
            if(s[index]=='(' || s[index]==')'){
                index=record[index];
                dir=-dir;
            }else{
                result+=s[index];
            }
            index+=dir;
        }
        return result;
    }
};

看不懂的同学可以看一下下面这个链接的动图,非常形象。

leetcode-cn.com/problems/re…

创作不易,点个赞就是对作者最大的鼓励。

搜索公众号:菜鸟阿力

每天都会在公众号分享学习积累,欢迎关注~