美文网首页
1190. 反转每对括号间的子串

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

作者: 周英杰Anita | 来源:发表于2019-12-12 21:01 被阅读0次

    题目描述:

    给出一个字符串 s(仅含有小写英文字母和括号)。

    请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

    注意,您的结果中 不应 包含任何括号。
    示例 1:

    输入:s = "(abcd)"
    输出:"dcba"
    

    示例 2:

    输入:s = "(u(love)i)"
    输出:"iloveu"
    

    示例 3:

    输入:s = "(ed(et(oc))el)"
    输出:"leetcode"
    

    示例 4:

    输入:s = "a(bcdefghijkl(mno)p)q"
    输出:"apmnolkjihgfedcbq"
    

    提示:

    0 <= s.length <= 2000
    s 中只有小写英文字母和括号
    我们确保所有括号都是成对出现的
    

    思路:

    1、从左向右依次遍历字符串;
    2、将非“)”的元素入栈;
    3、遇到“)”,将栈顶非“(”的元素依次弹出,并存储到StringBuilder中;
    4、将StringBuilder的元素反转;
    5、将栈顶“(”弹出;
    6、将StringBuilder转化成string将其中元素依次push到栈中;
    7、最后将栈中元素依次弹出存储到一个StringBuilder中;
    8、返回StringBuilder.toString()。
    

    Java解法:

    class Solution {
        public String reverseParentheses(String s) {
            Stack<Character> stack = new Stack<>();
            for(int i = 0; i < s.length(); i++)
            {
                if(s.charAt(i) != ')')
                {
                    stack.push(s.charAt(i));
                }else{
                    StringBuilder sb = new StringBuilder();
                    while (stack.peek() != '(')
                    {
                        sb.insert(0, stack.pop());
                    }
                    sb.reverse();
                    stack.pop();
                    String str = sb.toString();
                    for(int j = 0 ; j < str.length(); j++)
                    {
                        stack.push(str.charAt(j));
                    }
                }
            }
            StringBuilder ans = new StringBuilder();
            while (!stack.empty()) {
                ans.insert(0, stack.pop());
            }
            return ans.toString();
        }
    }
    

    python3思路:

    核心思想就是栈操作
    遇到左括号栈顶就压入空串,
    遇到右括号就反转栈顶并与栈顶第二个元素合并,
    其他情况栈顶直接累加元素,
    最后输出栈内唯一元素。
    

    python3解法:

    class Solution:
        def reverseParentheses(self, s: str) -> str:
            ans = ['']
            for c in s:
                if c == "(":
                    # ans.append('')
                    ans += ['']
                elif c == ")":
                    ans[-2] += ans[-1][::-1]
                    ans.pop()
                else:
                    ans[-1] += c
            # return ans[0]
            return ans.pop()
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-substrings-between-each-pair-of-parentheses/

    相关文章

      网友评论

          本文标题:1190. 反转每对括号间的子串

          本文链接:https://www.haomeiwen.com/subject/cwoagctx.html