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