LeetCode——1190. 反转每对括号间的子串(Java)

题目描述

题干:
给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中不应包含任何括号。

示例1:
输入:s = "(abcd)"
输出:"dcba"

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

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

题解思路

返回逐层反转的字符串,返回结果不带括号,遇到反转,最先想到的就是栈的特色了

如果采取栈方法的话,每次遇到一个完整的括号就反转一次存储好的字符串

栈方法讲究从前往后开始获取元素反转,如果从中间开始反转,就可以采用双指针的方法

也是每次遇到一个完整的括号就可以用reverse方法反转再拼接

正确代码

    //栈方法
    public String reverseParentheses01(String s) {
        Deque<String> stack = new LinkedList<>();
        StringBuffer buffer = new StringBuffer();
        //用buffer存储括号内的元素
        //每次遇到一对括号就反转buffer内的元素
        //
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                stack.push(buffer.toString());
                buffer.setLength(0);
            } else if (ch == ')') {
                buffer.reverse();
                buffer.insert(0, stack.pop());
            } else {
                buffer.append(ch);
            }
        }
        return buffer.toString();
    }

    //双指针
    public String reverseParentheses02(String s) {
        StringBuilder builder = new StringBuilder(s);
        while (true) {
            //end和prev分别得到最中间的括号下标
            int end = builder.indexOf(")");
            int prev = builder.lastIndexOf("(", end);
            if (prev == -1 || end == -1) {
                break;
            }
            //去括号
            StringBuilder builder1 = new StringBuilder(builder.substring(prev + 1, end));
            //反转
            builder1.reverse();
            //拼接反转后的字符串
            builder.replace(prev, end + 1, builder1.toString());
        }
        return builder.toString();
    }


总结

这道题令我没想到的是官方评论区给出了如此多的解法,思路百花齐放

有人用正则表达式匹配反转,有的用dfs模型反转,当然还有很多很多值得我们去学习的思路

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-05-26 19:56  21岁还不是架构师  阅读(217)  评论(0编辑  收藏  举报