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

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

原题链接:Leetcode 1190. 反转每对括号间的子串

题目描述

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

示例1

输入: (abcd)
输出: dcba

示例2

输入: (u(love)i)
输出: iloveu

示例3

输入: (ed(et(oc))el)
输出: leetcode

示例4

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

示例5

输入: ta()usw((((a))))
输出: tauswa

解题思路1:栈

详见这位大佬的题解:栈+动图演示

解题思路2:正则匹配

正则表达式:\\(([^()]*?)\\)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Solution {
    public String reverseParentheses(String s) {
        StringBuilder str = new StringBuilder(s);
        Pattern pattern = Pattern.compile("\\(([^()]*?)\\)");
        while (str.indexOf("(") >= 0) {
            Matcher matcher = pattern.matcher(str);
            if (matcher.find()) {
                // 如果匹配到括号对,则使用StringBuilder将括号内的内容reverse
                StringBuilder t = new StringBuilder(str.substring(matcher.start() + 1, matcher.end() - 1)).reverse();
                // 然后再将reverse后的字符串替换到正则匹配到的位置上去
                str.replace(matcher.start(), matcher.end(), t.toString());
            }
        }
        return str.toString();
    }
}

解题思路3:字符串处理

class Solution {
    public String reverseParentheses(String s) {
        StringBuilder str = new StringBuilder(s);
        while (str.indexOf("(") >= 0) {  // 如果字符串内还有括号则进行处理
            int start = str.lastIndexOf("(");  // 找到最后一个括号的下标
            int end = str.indexOf(")", start) + 1;  // 找到最后一个括号之后的第一个反括号的下标
            StringBuilder t = new StringBuilder(str.substring(start + 1, end - 1)).reverse();  // 取到两括号之间的字符串进行reverse
            str.replace(start, end, t.toString());  // 用reverse后的字符串替换原字符串
        }
        return str.toString();
    }
}
posted @ 2021-05-26 10:36  胡人天  阅读(151)  评论(0编辑  收藏  举报