给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中 不应 包含任何括号。
示例 1:
输入:s = "(abcd)" 输出:"dcba"
示例 2:
输入:s = "(u(love)i)" 输出:"iloveu" 解释:先反转子字符串 "love" ,然后反转整个字符串。
示例 3:
输入:s = "(ed(et(oc))el)" 输出:"leetcode" 解释:先反转子字符串 "oc" ,接着反转 "etco" ,然后反转整个字符串。
匹配到左括号'(' 时把位置入栈,
匹配度右括号是')'时和栈顶的左括号匹配,确定需要反转子串的start和end索引
反转start和end之间的字符串
重步骤1、2、3,直到循环结束
public String reverseParentheses(String s) {
//使用栈匹配有效的括号
Stack<Integer> stack = new Stack<>();
//存储交换后的字符
int[] cs = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i)=='('){
stack.add(i);
continue;
}else if (s.charAt(i)==')'){
final Integer pop = stack.pop();
cs = swap(cs,pop+1,i);
continue;
}
cs[i]=s.charAt(i);
}
//去掉原来括号占的位置
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cs.length; i++) {
if (cs[i]!=0){
sb.append((char) cs[i]);
}
}
return sb.toString();
}
//交换字符串
private int[] swap(int[] cs, int start, int end) {
//只需遍历字符串长度的一半
for (int j = 0; j <(end-start)/2; j++) {
cs[j+start] = cs[j+start]^cs[end-j-1];
cs[end-j-1] =cs[j+start]^cs[end-j-1];
cs[j+start] =cs[j+start]^cs[end-j-1];
}
return cs;
}
时间复杂度:O(n)
空间复杂度:O(n)