20.有效的括号

题目描述

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

有效字符串需满足:

1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例1:

输入: "()"
输出: true

示例2:

输入: "(]"
输出: false

思路

1.判断括号匹配很符合栈的特点,所以我们可以用栈来实现。
2.我们可以用哈希表来存储一组括号,将右括号作为键值,因为我们要通过右括号判断是否取出栈顶元素。
3.最后注意处理栈空的情况就可以了。

Java代码实现

  public boolean isValid(String s) {
        Map<String,String> bracketsMap = new HashMap<String,String>();
        bracketsMap.put(")","(");
        bracketsMap.put("]","[");
        bracketsMap.put("}","{");

        Stack<String> bracketsStack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            String cur = s.substring(i,i+1);
            //判断是否为右括号系列
            if(bracketsMap.containsKey(cur)){
                //若要压入的值为右括号,且栈为空,那一定无法匹配
                if(bracketsStack.empty())
                    return false;
                else {
                    //判断括号是否匹配
                    if(bracketsMap.get(cur).equals(bracketsStack.peek())){
                        bracketsStack.pop();
                    }else {
                        bracketsStack.push(cur);
                    }
                }
            }else {
                bracketsStack.push(cur);
            }
        }

        return bracketsStack.empty();
    }

Golang代码实现

func isValid(s string) bool {
    stack := list.New()
    paramMap := map[string]string{
        ")":"(",
        "}":"{",
        "]":"[",
    }
    for i:=0; i<len(s); i++ {
        if stack.Len() == 0 {
            stack.PushBack(s[i:i+1])
        }else{
            cur := s[i:i+1]
            top := stack.Back()
            if paramMap[cur] == top.Value {
                stack.Remove(top)
            }else{
                stack.PushBack(cur)
            }
        }
    }
    return stack.Len() == 0;
}
全部评论

相关推荐

OPSL:钱确实给的多,但是追责这一点比较迷惑…3个月具体如何计算呢?出勤天数30*3吗?还是21*3呢?万一中间学校有安排怎么办呢?这个得多问一问呀
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务