题目描述
题干:
给出一个字符串 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模型反转,当然还有很多很多值得我们去学习的思路
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见