美文网首页
Java算法--括号是否有效

Java算法--括号是否有效

作者: 谢不再 | 来源:发表于2017-04-26 20:18 被阅读322次
最近面试机会好少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

相关文章

  • Java算法--括号是否有效

    最近面试机会好少o(╯□╰)o,记录个笔试时的算法题 给定一个字符串所表示的括号序列,包含以下字符: '(', '...

  • 经典算法 — 有效的括号

    经典算法 — 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否...

  • 要成功就做一百题-93

    题目名称 有效的括号判断 描述 输入的字符串只包含{ [] } ()三种括号的组合,判断输入是否是有效的括号,如下...

  • 20. valid Parentheses 有效括号

    题目 给定一个字符串 s 包含一组括号,判断这组括号是否是有效的。有效定义:(1)开括号必须由闭括号关闭(2)关闭...

  • 字符串的括号匹配(python)

    括号匹配说明 本方法字符串中只有 () 括号 算法思路 从左到右遍历字符串 如果不是括号,默认是有效字符,遍历下一...

  • java括号匹配算法

    我们经常在各种IDE(集成开发环境)中敲代码。 现在的IDE非常智能,并会给出相应提示,还有及时的错误提醒。 其中...

  • 20.有效括号

    检测括号对 (),{},[]是否有效。 思路:利用堆栈。遇到左括号压入堆栈,遇到右括号从堆栈弹出并比较。注意(),...

  • 其余代码题

    链表是否有环-done 表达式计算-done 括号匹配-done 最长有效括号长度 链表是否有环 提示:快慢指针 ...

  • 2020-09-20

    数据结构与算法系列(一)栈:如何实现有效括号的判断? 有效括号,我想很多人对LeetCode上的这道题很熟悉吧? ...

  • 算法杂记(有效的括号)

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:1...

网友评论

      本文标题: Java算法--括号是否有效

      本文链接:https://www.haomeiwen.com/subject/zolwzttx.html