在某算法比赛上看到的惊为天人的算法解决计算完美闭合括号数量问题(()()??))——java-based

原题是这样的:

给定字符串序列 ()()??(?

判断 这里面包含几个完美闭合的()。?可以代表)或者(。

e.g.  上述序列的完美闭合() 字串是:

()

()

??

(?

()()

()??

??(?

()()??

()??(?

()()??(?

答案是10, 因为有十种可以完美闭合的字串。

注: (??) 可以表示为 ()()和(()) 都是完美闭合的括号。但是计数的时候算一次,因为要找多少组数量,而不是多少种组合。

对于这道题,我第一思路是,用一个char的数组,通过闭合消解的方式(把可以闭合的答案用‘0’来代替),最后判断char数组中是否全部为0,这样解决的算法非常难以平衡一些特殊情况,可能需要用递归方式判断各种可能性,而且算法效率也不高。

在众多码农中,有一个人写的答案让我叹为观止。

他的解法是这道题复杂度的最优算法 On^2。(必须两个for循环来遍历所有组合)

而他的判断方法如下:

假设str就是我们得到的序列
char[] cha = str.toCharArray();
int count = 0;
for(int i = 0; i< cha.length; i++){
    int x = 0;
    int y = 0;
    for (int j = i; j<cha.length; j++){
        if(cha[j]==')'){
            x--;
            y--;
        }else{
            if(cha[j]=='('){
                x++;
                y++;
            }else{
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值