题解 | #合法的括号字符串#

合法的括号字符串

http://www.nowcoder.com/practice/eceb50e041ec40bd93240b8b3b62d221

使用两个栈,一个存放左括号,一个存放*,如果碰到右括号,先和左括号栈里的进行抵消,如果左括号栈为空再和*栈的抵消。最后再判断左括号栈长度是否小于等于*栈,满足的话说明剩余的左括号也都可以抵消,但是这样忽略了左括号和*的有效作用区间,也就是入栈时间,比如**((),最后虽然*栈长度大于左括号栈,但是那些*是在左括号之前的,无法与左括号进行抵消。

因此还需要两个栈来分别计算左括号栈和*栈中数据的入栈时间(可以用在数组中的index),它们与左括号栈和*栈同时进行push(),pop()操作。

最后遍历两个时间栈,如果存在左括号的时间>*的时间,说明不合法返回false。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isValidString (String s) {
        // write code here
        char[] str = s.toCharArray();
        // 存放左括号
        Deque<Character> stack = new LinkedList<>();
        // 记录左括号栈里的左括号入栈时间
        Deque<Integer> stackNum = new LinkedList<>();
        // 存放*号
        Deque<Character> stack2 = new LinkedList<>();
        // 记录*栈中 *的入栈时间
        Deque<Integer> stackNum2 = new LinkedList<>();
        for(int i = 0;i<str.length;i++){
            if(str[i] == '('){
                stack.push(str[i]);
                stackNum.push(i);
            }else if(str[i] == '*'){
                stack2.push(str[i]);
                stackNum2.push(i);
            }else{ // 如果遇到右括号
                // 先判断 stack是否为空
                if(!stack.isEmpty()){
                    stack.pop();
                    stackNum.pop();
                }else{
                    if(stack2.isEmpty()){
                        return false;
                    }else{
                        stack2.pop();
                        stackNum2.pop();
                    }
                }
            }
        }
        
        while(!stack.isEmpty() && !stack2.isEmpty()){
            // 如果左括号入栈时间比*晚 返回false
            // 因为即使有* 但是它无法作用到后面的左括号 比如 **( 就是不合法的
            if(stackNum.pop() > stackNum2.pop())
                return false;
            stack.pop();
            stack2.pop();
        }
        return stack.isEmpty();
    }
}
全部评论

相关推荐

昨天 11:19
已编辑
门头沟学院 Java
已经一年没发牛客了,为什么呢,因为没脸发...&nbsp;一年前的我自认为在25届中技术一流,八股无敌,项目出色,但是一年校招的蹉跎让我差点转行。24年春招收割了十几个实习&nbsp;offer&nbsp;之后我去了某家大厂实习到9月份转正失败,那时候的我还没有意识到噩梦将来,7月因为投秋招提前批没反馈,于是开始投了几个实习转正岗位练手又拿了3个中大厂&nbsp;offer,这时的我沉浸在我自以为是的骄傲里。9月秋招正式批开始后我几乎把我能找到的所有的岗位都投了一遍,只收获了大厂海笔,0面试。10月份第一家给我面试的公司是数字马力(蚂蚁的内包),诚恳的说,当时收到这家面试是嚣张的,觉得我拿这个&nbsp;offer&nbsp;如探囊取物,就当个保底吧。...
中街牛奶提子:是啊,不应该在秋招的时候继续投实习岗。也劝26届的,八月末后,实习岗就不应该投,给人错误的行情认知。佬是学院本,觉得约面难,双非何尝不是一样呢,秋招战场的激烈和实习完全不同。当时我秋招的时候也是边面实习,当时面实习面一个过一个觉得自己很优越,觉得能收获一堆实习offer那秋招肯定也行。为什么要在秋招拿一堆实习offer增强自己所谓的虚荣心,当时就是贱,为了所谓的攀比虚荣心
点赞 评论 收藏
分享
01-17 10:48
门头沟学院 Java
xxxxOxo:这公司幽默得很,要了简历半天一点动静都没有,过一会就给你发个邮件让你做测试,做完又没后文了,纯溜人
点赞 评论 收藏
分享
03-13 12:48
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务