庖丁解牛:栈的拿手好戏

栈的拿手好戏

有效的括号

(1) 题目描述

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

有效字符串需满足:

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

(2) 题解代码

朴素思想实现
class Solution {

    static boolean isLeft(char c){
        return c == '(' || c ==  '{' ||  c ==  '[';
    }
    static boolean isRight(char c){
        return c == ')' || c ==  '}' ||  c ==  ']';
    }

    static boolean weAreFamliy(char c, char see){
        if(c == ')'){
            if(see == '('){
                return true;
            }else{
                return false;
            }
        }
        if(c == '}'){
            if(see == '{'){
                return true;
            }else{
                return false;
            }
        }
        if(c == ']'){
            if(see == '['){
                return true;
            }else{
                return false;
            }
        }
        return true;
    }

    public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0; i<s.length() ; i++){
            char cur = s.charAt(i);
            if(isLeft(cur)){
                stack.push(cur);
            }
            if(isRight(cur)){
                if(stack.isEmpty()){
                    return false;
                }
                boolean result = weAreFamliy(cur,stack.pop());
                if(!result){
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String s ="()[]{}";
        boolean result = isValid(s);
        System.out.println(result);

    }
}
改写映射关系
class Solution {

    boolean isLeft(char c,HashMap map){
        return map.values().contains(c);
    }
    boolean isRight(char c,HashMap map){
        return map.keySet().contains(c);
    }

    boolean weAreFamliy(char c, char see,HashMap map){
        return map.get(c).equals(see);
    }

    public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        HashMap<Character,Character> map = new HashMap<>();

        map.put(')','(');
        map.put('}','{');
        map.put(']','[');

        for(int i=0; i<s.length() ; i++){
            char cur = s.charAt(i);
            if(isLeft(cur,map)){
                stack.push(cur);
            }
            if(isRight(cur,map) &&(
                    stack.isEmpty() || !weAreFamliy(cur,stack.pop(),map)
            )){
                return false;
            }
        }
        return stack.isEmpty();
    }
}

(3) 算法笔记

  • 建立左右括号的映射关系,注意,需要把右括号设置为,左括号设置为值,
    • 因为后续匹配的过程需要根据右括号查找左括号。
  • 遍历字符串,遇到左括号进压入栈,遇到右括号需要进行判断
    • 右括号是否和栈顶的左括号匹配,如果不匹配,直接返回false
    • 如果匹配,继续遍历字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值