题目描述:
解题思路:
类似于括号匹配的问题,第一次自己写的时候,提交了好几次才过,思路就是使用栈,主要需要处理的就是找到哪些括号是匹配的那些是不匹配的。首先遇到‘(’就进栈,遇到‘)’需要分两种情况,如果栈不为空的时候,说明之前有过‘(’,就出栈,代表找到一对匹配的,但是如果栈为空,说明‘)’在还没有出现‘(’的时候就先出现了,那么显然出现的都是不匹配的,我们将这些不匹配的存入数组中,最后遍历完,在判断栈是否为空,如果不为空,说明还有没有匹配的‘(’,这些也是不匹配的。知道所以不匹配的情况,就可以将这些不匹配的换成一个字符串中本来没有的字符,给出的代码中,我替换成了3,然后再替换成空字符串就可以了。
参考代码:
public String minRemoveToMakeValid(String s) {
char[] c = s.toCharArray();
Stack<Integer> stack = new Stack<>();
int[] arr = new int[s.length()];
int res = 0;
for (int i = 0; i < c.length; i++) {
if (c[i] == '(') {
stack.push(i);
}
if (c[i] == ')') {
if (!stack.isEmpty()) {
stack.pop();
} else {
arr[res++] = i;
}
}
}
for (int i = 0; i < res; i++) {
c[arr[i]] = '3';
}
while (!stack.isEmpty()) {
int x = stack.pop();
c[x] = '3';
}
String str = String.valueOf(c);
str = str.replace("3", "");
return str;
}
另一种解法用一个boolean数组标记每一个位置,是否是匹配的,
参考代码:
public String minRemoveToMakeValid(String s){
Stack<Integer> stack=new Stack<>();
boolean[] invalid=new boolean[s.length()];
StringBuilder result=new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)=='(')
{
stack.push(i);
//无效
invalid[i]=true;
}
if(s.charAt(i)==')')
{
if(stack.empty())
{
invalid[i]=true;
}
else
{
invalid[stack.pop()]=false;
}
}
}
for (int i = 0; i < s.length(); i++) {
if(invalid[i])
{
result.append(s.charAt(i));
}
}
return result.toString();
}