一、题目
演示示例:
二、测试代码
//辅助栈
class Solution {
public int minAddToMakeValid(String S) {
Stack<Character> stack=new Stack<>();
for(char c:S.toCharArray()){//遍历符号串
if(c=='('){//遇见左括号直接入栈
stack.push(c);
}
if(c==')'){
if(!stack.isEmpty()&&stack.peek()=='('){//遇见右括号判断栈顶元素是否为左括号和栈是否为空,若符合则将栈顶元素弹出,若不符合则将右括号入栈
stack.pop();
}else{
stack.push(c);
}
}
}
return stack.size();//栈的大小即为最少添加的括号数量
}
}
//一次遍历
class Solution {
public int minAddToMakeValid(String S) {
int count1=0;//统计左括号数量和消除匹配的右括号
int count2=0;//统计没有匹配的括号数量
for(int i=0;i<S.length();i++){
if(S.charAt(i)=='('){
count1++;
}else{
if(count1>0){//消除匹配的右括号
count1--;
}else if(count1<=0){//没有匹配的括号
count2++;
}
}
}
return count1+count2;
}
}
三、运行情况
方法一:
方法二:
四、刷题总结
方法一的主要思路:我们利用栈进行统计。遍历时遇见左括号直接入栈,遇见右括号判断栈是否为空和栈顶元素是否为左括号,若符合则将栈顶元素弹出,若不符合则将右括号入栈,最后栈的大小即为最少添加的括号数量。注意在判断栈是否为空和栈顶元素是否为左括号,需要先判断栈是否为空再判断栈顶元素是否为左括号,因为若先判断栈顶元素是否为左括号,使用peek()方法可能会出现空栈错误。
方法二:我们定义两个变量count1和count2,count1用于统计左括号数量和消除匹配的右括号,count2用于统计没有匹配的括号数量,最后count1和count2之和即为最少添加的括号数量。可以根据演示示例自己动笔计算验证。