题目描述:
给出一个字符串 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 中只有小写英文字母和括号
我们确保所有括号都是成对出现的
思路:用递归的思想,依次反转越来越靠外的完整小括号对。
package saima;
public class Main36 {
public static void main(String[] args) {
Main36 main36 = new Main36();
String s = "(ed(et(oc))el)";
String s1 = "(u(love)i)";
System.out.println(main36.reverseParenttheses(s1));
}
public String reverseParenttheses(String s) {
if (s == null || s.length() == 0) {
return null;
}
if (s.length() == 1) {
return s;
}
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
int j = i;
int num = 0;
for (; j < s.length(); j++) {
// 括号多一个
if (s.charAt(j) == '(') {
num++;
}
// 括号结束一个
if (s.charAt(j) == ')') {
num--;
}
// 必须放在最后
if (num == 0) {
break;
}
}
// 递归处理将外层括号剥离后的子字符串
StringBuffer stringBuffer2 = new StringBuffer(reverseParenttheses(s.substring(i+1, j)));
// 反转子字符串,并加到父字符串
for (int k = stringBuffer2.length()-1; k >= 0; k--) {
stringBuffer.append(stringBuffer2.charAt(k));
}
// 此时i应该往后移动
i = j;
}
else {
stringBuffer.append(s.charAt(i));
}
}
return stringBuffer.toString();
}
}