题目
一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ““和”(())()“是完整的括号字符串,”())(”, “()(” 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。
输入输出描述:
输入描述:
输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50).
s中每个字符都是左括号或者右括号,即’(‘或者’)’.
输出描述:
输出一个整数,表示最少需要添加的括号数
示例1
输入:(()(()
输出:2
分析
注意:这里分析的时候用到栈的思想,是为了方便理解,但实现不一定要用栈,可以直接用数组去模拟栈的实现过程。
- 设置两个整数leftnum, rightnum分别计算多余的左括号数和右括号数,初始值都为0。
- 如果遇到 ‘(’ 则将其入栈,并将leftnum++,遇到 ‘)’ 则将栈中的 ‘(’ 出栈一次,并将leftnum–。
- 注意出栈前要先检查栈是否为空(leftnum == 0),如果为空,则说明字符串里的右括号数多于左括号数,要将rightnum++。
- 最后输出leftnum+rightnum即是要添加的括号数。
为了方便理解,画了一个模拟实现图如下:
代码
import java.util.Scanner;
public class Main{
/*
可以用数组直接模拟“进栈”,“出栈”的效果
如果当前元素是左括号,则leftnum++,如果当前元素是右括号,则leftnum--
当左括号比右括号多时,返回leftnumm即是要添加的括号数量
当leftnum==0时,也就是说右括号比左括号多,则rightnum++
最后返回leftnum+rightnum
*/
public static int addBracket(String s){
int leftnum = 0; //记录未被配对的左括号数目
int rightnum = 0; //记录未被配对的右括号数目
int i = 0; //i用来计数
while(i < s.length()){
if(s.charAt(i) == '('){
leftnum++;
}else{
if(leftnum == 0){ //说明所有的左括号已被匹配完毕
rightnum++;
}else{
leftnum--; //新进来的右括号要匹配一个之前的左括号
}
}
i++;
}
return leftnum+rightnum;
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int num = addBracket(str);
System.out.print(num);
}
}