算法—添加括号问题

题目

一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ““和”(())()“是完整的括号字符串,”())(”, “()(” 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。

输入输出描述:

输入描述:
输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50).
s中每个字符都是左括号或者右括号,即’(‘或者’)’.
输出描述:
输出一个整数,表示最少需要添加的括号数

示例1
输入:(()(()
输出:2

分析

注意:这里分析的时候用到栈的思想,是为了方便理解,但实现不一定要用栈,可以直接用数组去模拟栈的实现过程。

  1. 设置两个整数leftnum, rightnum分别计算多余的左括号数和右括号数,初始值都为0。
  2. 如果遇到 ‘(’ 则将其入栈,并将leftnum++,遇到 ‘)’ 则将栈中的 ‘(’ 出栈一次,并将leftnum–。
  3. 注意出栈前要先检查栈是否为空(leftnum == 0),如果为空,则说明字符串里的右括号数多于左括号数,要将rightnum++。
  4. 最后输出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);
    }
}

运行结果

运行结果

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值