有效的括号算法题——坚持刷算法第四天

题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

自己写的

class Solution {
     public boolean isValid(String s) {
        // 用栈的思维 遇到左括号入栈,遇到右括号进行出栈,如果匹配则继续,不匹配退出,说明不是有效括号字符串
        int sum = 0;
        boolean result = true;
        Stack<Character> bracketStack = new Stack<>();
        for (int i = 0; i < s.length(); i++ ){
            if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
                bracketStack.push(s.charAt(i));
            } else {
                if (bracketStack.isEmpty()) {
                    result = false;
                    break;
                }
                sum = getBracketValue(s.charAt(i)) + getBracketValue(bracketStack.pop());
                if (sum != 0) {
                    result = false;
                    break;
                }
            }
        }

        // 如果栈不为空,表示还有左括号被遗留没有被配对
        if (!bracketStack.isEmpty()) {
            result = false;
        }
        return result;
    }

    // 定义括号值
    private int getBracketValue(char ch) {
        switch(ch) {
            case '(': return -1;
            case ')': return 1;
            case '[': return -2;
            case ']': return 2;
            case '{': return -3;
            case '}': return 3;
            default: return 0;
        }
    }
}
  • 执行用时和内存消耗
执行用时 :
2 ms, 在所有 Java 提交中击败了88.94%的用户
内存消耗 :
37.5 MB, 在所有 Java 提交中击败了5.14%的用户

自己写的思路

  • 用栈的思维 遇到左括号入栈,遇到右括号进行出栈,如果匹配则继续,不匹配退出,说明不是有效括号字符串
  • 左括号代表负值,右括号代表正值。所有有效字符串的里层一定是由可匹配的括号字符组成的,即左括号+右括号=0 基于这个逻辑。遍历字符串,遇到左括号入栈,遇到右括号出栈进行对应值的相加。如果不等于0,就返回false。
  • 其中要注意两个场景:
  • 一个是循环后,栈中还有值,表示还有左括号被遗留没有被配对
  • 二是栈中为空,但是右括号多了的情况,我这边都是单独判断处理了。

  • 个人理解
没有看最优解,因为这个思路的运行效率已经满意了。
有些写法上可能可以优化,会加快运行效率。如:字符对应值的那段可以用hashmap并且定义在静态代码块。
条件判断多了一些,可能可以简化。

【对于算法题中,字符串的处理最好当成数学题来做。不要用到JAVA中对字符串自带的一些用法。】如.indexOf()之类的函数。算法题的本质还是思想,思路。不是考究每个语言对每个数据类型提供的支持更多一些。这个是我以前经常做算法题的误区。遇到题目,第一想的就是,JAVA自带的类函数支持不支持,比如字符串反转什么的。而不是尝试用算法思维去解决。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值