思路:先把所有括号提取出来,再从左边扫描,去除多余的右边括号;再从右边扫描,去除多余的左括号;最后再扫描原数组,进行括号匹配,拼接答案。
public String minRemoveToMakeValid(String s) {
Deque<Character> deque = new ArrayDeque<>();
StringBuilder dict = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i)=='('||s.charAt(i)==')')dict.append(s.charAt(i));
}
int flag=0;
List<Character> list = new ArrayList<>();
for (int i = 0; i < dict.length(); i++) {
if (dict.charAt(i)=='('){
flag++;
}else flag--;
if (flag==0){
deque.add(dict.charAt(i));
while (!deque.isEmpty()) list.add(deque.pop());
}else if (flag<0)flag=0;
else deque.add(dict.charAt(i));
}
while (!deque.isEmpty())
list.add(deque.pop());
List<Character> list1 = new ArrayList<>();
flag=0;
for (int i = list.size()-1; i >=0; i--) {
if (list.get(i)==')'){
flag++;
}else flag--;
if (flag==0){
deque.add(list.get(i));
while (!deque.isEmpty()) list1.add(0,deque.pop());
}else if (flag<0)flag=0;
else deque.add(list.get(i));
}
StringBuilder res = new StringBuilder();
flag=0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i)=='(' || s.charAt(i)==')'){
if (flag < list1.size() && s.charAt(i)==list1.get(flag)){
flag++;
res.append(s.charAt(i));
}
}else res.append(s.charAt(i));
}
return res.toString();
}