题目描述:
题目分析:这个不是搜索的题目,但是作为上一题的扩充,想要无效变得有效,那么就把无效的左括号和右括号分别去掉即可,需要知道一下两点:
-
如何让每对括号匹配起来?如何删除不合法的左括号?使用栈,每次遇到”(“就把index入栈,遇到")"就弹出一个”(“,他们就是一对匹配的括号,如果最后栈还剩下”(“,说明这些左括号是无法匹配的。
-
如何删除不合法的右括号?在遍历的同时记住左括号数量>=右括号数量,如果出现右括号导致不合法,那就删去。
思路就是把无效的东西改为空格,之后分割再拼接。
AC代码:
class Solution {
public String minRemoveToMakeValid(String s) {
StringBuilder sb = new StringBuilder(s);
int right = 0;
int left = 0;
for(int i =0;i<=sb.length()-1;i++){
if(sb.charAt(i)=='('){
left++;
}
if(sb.charAt(i)==')'){
right++;
}
if(right>left){
sb.setCharAt(i,' ');
right--;
}
}
Stack<Integer> stack = new Stack<>();
for(int i =0;i<=sb.length()-1;i++){
if(sb.charAt(i)=='('){
stack.add(i);
}
if(sb.charAt(i)==')'){
stack.pop();
}
}
for(int e : stack){
sb.setCharAt(e,' ');
}
String line = sb.toString();
String[] lines = line.trim().split(" ");
String ans = "";
for(int i =0;i<=lines.length-1;i++){
ans += lines[i];
}
return ans;
}
}
运行结果: