括号匹配(二)

括号匹配(二)
时间限制:1000 ms  |  内存限制:65535 KB
难度:6

描述
    给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
    如:
    []是匹配的
    ([])[]是匹配的
    ((]是不匹配的
    ([)]是不匹配的

输入
    第一行输入一个正整数N,表示测试数据组数(N<=10)
    每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
    对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入

    4
    []
    ([])[]    
    ((]
    ([)]

样例输出

    0
    0
    3
    2


----------------------------------------------------------------------------------------------

import java.util.ArrayList;
import java.util.List;

public class Brackets {
    public static int max=0;
    public static void main(String[] args) {
        String str="(()]";   //(]]]])]
    //    System.out.println("ok");
        str=oneTest(str);
    //    int i=str.length();
    //    System.out.println(str+"_______"+i);
//        str=oneTest(str);
    //    System.out.println(str);
        twoTest(str);
        System.out.println(max);
    
    }
    public static String oneTest(String str){             //挨着
        List<String> list=new ArrayList<String>();        
        for(int i=0;i<str.length();i++)
            list.add(str.charAt(i)+"");
        List<Integer> tmp=new ArrayList<Integer>();
        while(true){
                for(int t=1;t<list.size();t++){
                    String ch=list.get(t-1);//前一个比较数据
                    if(ch.equals("("))
                        ch=")";
                    else if(ch.equals(")"))
                        ch="(";
                    else if(ch.equals("["))
                        ch="]";
                    else
                        ch="[";
                    if(ch.equals(list.get(t))){
                        tmp.add(t-1);
                        tmp.add(t);
                    }
                }
                  
                for(int len=tmp.size()-1;len>=0;len--){    
                    int i=tmp.get(len);
                    list.remove(i);;
                }
                if(tmp.size()==0)
                       break;
                tmp.clear();
        }
        String st="";
        for(String s:list)
            st+=s;
        return st;
        }

    public static int twoTest(String str){
        //List<String> death=new ArrayList<String>();    
        int num=0;
        List<String> list=new ArrayList<String>();            
        for(int i=0;i<str.length();i++)
            list.add(str.charAt(i)+"");
    //    List<Integer> tmp=new ArrayList<Integer>();
        for(int t=1;t<=list.size();t++){
            String ch=list.get(t-1);//前一个比较数据
            if(ch.equals("("))
                ch=")";
            else if(ch.equals(")"))
                ch="(";
            else if(ch.equals("["))
                ch="]";
            else
                ch="[";
            int i=list.indexOf(ch)-t+1; //之间的距离大于2   ch=t-1
            if(i>=2){
                t=i;
                String ss="";
                for(int m=t-1;m<=i;m++)
                    ss+=list.get(m);
                twoTest(ss);
            }
            else
                max++;
        }
        return max;
    }
    
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值