Java算法--括号是否有效

最近面试机会好少o(╯□╰)o,记录个笔试时的算法题

给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列。括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]"则是无效的括号。

补充:个人觉得出题人的本意是如"{[()]}"这种成对出现也是有效的。

分析1:有效的括号是成对的,我们定义一个方法将成对的括号转换成和为0的正负数,如 '(' 转换成-1,')'转换成1;

private int whatParentheses(char ch) {
        switch (ch) {
            case '(':
                return -1;
            case '[':
                return -2;
            case '{':
                return -3;
            case ')':
                return 1;
            case ']':
                return 2;
            case '}':
                return 3;
        }
        return 0;
    }

分析2:给出几个有效的 "( [ ] )" ,"( ) { }","[ { ( )}]",可以看出第一个右括号的左边一定必须是它对应的左括号才有效。
得出一个解题思路:遍历字符串字符,如果是左括号那么我们用一个数据结构存起来,遇到第一个右括号时取数据结构中的最后一个数据,判断是否是对应的左括号。如果不是那么此序列是无效的,如果是那么我们把这一对括号移除掉(其实只是移除了最后一个左括号)再继续遍历。用栈Stack来实现可能比较理想,上代码。

private boolean isParenthesesValid(String s) {
        //字符串为空
        if (s==null){
            return false;
        }
        int length=s.length();
        Stack<Character> stack=new Stack<>();
        //存储遍历的字符
        char ch;
        //存储字符转换后的数字
        int parentNum;
        //记录下括号出现的次数
        int count=0;
        for (int i=0;i<length;i++){
            ch=s.charAt(i);
            parentNum=whatParent(ch);
            if(parentNum<0){
                count++;
               // <0表示这是个左括号
                stack.push(ch);
            }else if(parentNum>0){
                count++;
                // >0表示这是个右括号
                if (stack.isEmpty()){
                    //右括号左边没有左括号的特殊情况
                    return false;
                }
                if(parentNum+whatParent(stack.peek())==0){
                    //栈顶是对应的左括号
                    stack.pop();
                }else{
                    return false;
                }
             }else{
                // =0 这不是一个括号,不管
             }
        }
         //字符串中有括号且栈最后被清空了,表示括号成对出现且有效
        if (count > 0 && stack.isEmpty()){
            return true;
        }
        return false;
    }
参考:有效的括号序列(LintCode)

LintCode 挺有意思的,还可以检测代码风格O__O

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:本翻译使用符号「」来突出某些可能会产生歧义的名词。目前状态:勘误中。 Unicode®标准附录#9 UNICO...
    Eriice阅读 2,137评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,268评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,890评论 18 139
  • 二零一零年十二月二十一日 天氣 Nice 今天是入伍的第一天,屬於適應期內,所以還是比較不錯的體驗。早上五點五十吹...
    啊Ben阅读 225评论 11 4
  • 周末的下午,商场里面挤满了购物消费或者娱乐的人群,当然这其中更少不了商场里面的工作人员,没有他们的辛劳付出,就不会...
    寒阳198阅读 207评论 0 0