- 反转每对括号间的子串
给出一个字符串 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”
思路: 变长数组模拟栈,对左括号进行先入后出操作,每拿出一个左括号,就去找对应的右括号,这里处理字符串都应该用StringBuffer处理,(因为String类中没有对应的reverse()方法)。
class Solution {
static String str;
public static String reverseParentheses(String s) {
str=s;
ArrayList<Integer>list =new ArrayList<Integer>();//存储 "(" 的下标
int len=s.length();
for(int i=0;i<len;i++){
if(str.substring(i,i+1).equals("(")){
list.add(i);
}
}
while(!list.isEmpty()){
int max=list.get(list.size()-1);
list.remove(list.size()-1);
for(int i=max;i<len;i++){
if(str.substring(i,i+1).equals(")")){
reverse(max,i);
break;
}
}
}
return str;
}
public static void reverse(int begin,int end){
//(rewq) --> 反转rewq 替换(rewq)
StringBuffer stringBuffer = new StringBuffer(str);
StringBuffer stringBuffer2 = new StringBuffer(str.substring(begin+1,end));
String temp=stringBuffer2.reverse().toString();//反转rewq
stringBuffer.replace(begin,end+1,temp);//替换(rewq)
str= stringBuffer.toString();
}
}