题目描述
一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
4、每个合法的括号序列都可以由以上规则生成。 例如,"(()())", ““和”(())()“是完整的括号字符串,”())(”, “()(” 和 ")"是不完整的括号字符串。
现在有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问至少需要添加多少个括号
输入描述
输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50).
s中每个字符都是左括号或者右括号,即’(‘或者’)’.
输出描述
输出一个整数,表示最少需要添加的括号数
示例
输入:(()(()
输出:2
我的代码
int num(String str){
if(str==null || str.length()==0) return 0;
int count = 0;
char[] chars = str.toCharArray();
for(char c :chars){
if(c=='('){
count++;
}else {count--;
}
return count>=0?count:(0-count);
}
存在的问题
直接用右括号+/左括号- 会导致,出现类似)(情况时,会认为相互抵消
输入为 )(())((((()()())))(()(())((()(()(((())(()(((((()))时,输出结果会10,实际应为12
应该考虑到到某个位置时左括号个数大于右括号的情况
借鉴思路
通过栈可将匹配的括号过滤掉,那么过滤完后栈的大小就是多余左括号的数量,再单独统计多余右括号的数量,最后将两者相加即可。
相应代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
Stack<Character> stack = new Stack<>();
int rightParenthesisNum = 0;
for(Character c : s.toCharArray()){
if(c.equals('(')){
stack.push('(');
}else {
if(!stack.isEmpty()){
stack.pop();
}else {
rightParenthesisNum++;
}
}
}
System.out.println(rightParenthesisNum + stack.size());
}