栈——括号比配问题

LeetCode20. 有效的括号icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/

LeetCode20. 有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

解题思路:

  1. 首先,检查输入字符串的长度是否小于等于1或者是否为奇数,如果是,则直接返回false。
  2. 创建一个HashMap,用于存储左右括号的对应关系。
  3. 创建一个栈,用于辅助括号匹配。
  4. 遍历输入字符串的每一个字符:
    • 如果当前字符是左括号,将其压入栈中。
    • 如果当前字符是右括号:
      • 如果栈不为空,弹出栈顶元素作为左括号。
      • 根据左括号在HashMap中查找对应的右括号。
      • 如果当前字符不等于右括号,说明括号不匹配,返回false。
      • 如果栈已经为空,说明右括号多于左括号,返回false。
  5. 最后,检查栈是否为空,如果为空,则说明所有左括号都找到了对应的右括号,返回true;否则返回false,说明左括号多于右括号。

我这里直接画一个流程图应该会更好理解一点~

代码如下:

boolean isValid(String s) {
    if(s.length()<=1 || s.length() % 2 == 1{
        return false;  // 如果字符串长度小于等于1或者为奇数,直接返回false
    }
    Map<Character,Character> smap = new HashMap<>();  // 创建一个Map用于存储左右括号对应关系
    smap.put('(',')');  // 将括号对应关系存入Map
    smap.put('{','}');
    smap.put('[',']');
    
    Stack<Character> stack = new Stack<>();  // 创建一个栈用于辅助括号匹配
    
    for(int i=0;i<s.length();i++){  // 遍历字符串的每一个字符
        char item = s.charAt(i);  // 获取当前字符
        if(smap.containsKey(item)){  // 如果当前字符为左括号
            stack.push(item);  // 将左括号入栈
        }else{  // 如果当前字符为右括号
            if(!stack.isEmpty()){  // 如果栈不为空
                Character left = stack.pop();  // 出栈一个左括号
                char rightchar = smap.get(left);  // 根据左括号获取对应的右括号
                if(rightchar != item){  // 如果当前字符不等于右括号
                    return false;  // 返回false,说明括号不匹配
                }
            }else {
                return false;  // 栈为空,说明右括号多于左括号,返回false
            }
        }
    }
    return stack.isEmpty();  // 最后判断栈是否为空,如果为空则说明括号全部匹配,返回true;否则返回false,说明左括号多于右括号
}

这题标着简单,但是我感觉挺难的...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值