zoukankan      html  css  js  c++  java
  • 有效的括号 栈

    有效的括号 - LeetCode 阅读
    https://leetcode-cn.com/articles/valid-parentheses/

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

    有效字符串需满足:

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

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

    让我们看看使用栈作为该问题的中间数据结构的算法。

    算法

    1. 初始化栈 S。
    2. 一次处理表达式的每个括号。
    3. 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
    4. 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
    5. 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
    class Solution {

    // Hash table that takes care of the mappings.
    private HashMap<Character, Character> mappings;

    // Initialize hash map with mappings. This simply makes the code easier to read.
    public Solution() {
    this.mappings = new HashMap<Character, Character>();
    this.mappings.put(')', '(');
    this.mappings.put('}', '{');
    this.mappings.put(']', '[');
    }

    public boolean isValid(String s) {

    // Initialize a stack to be used in the algorithm.
    Stack<Character> stack = new Stack<Character>();

    for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);

    // If the current character is a closing bracket.
    if (this.mappings.containsKey(c)) {

    // Get the top element of the stack. If the stack is empty, set a dummy value of '#'
    char topElement = stack.empty() ? '#' : stack.pop();

    // If the mapping for this bracket doesn't match the stack's top element, return false.
    if (topElement != this.mappings.get(c)) {
    return false;
    }
    } else {
    // If it was an opening bracket, push to the stack.
    stack.push(c);
    }
    }

    // If the stack still contains elements, then it is an invalid expression.
    return stack.isEmpty();
    }
    }
    class Solution(object):
    def isValid(self, s):
    """
    :type s: str
    :rtype: bool
    """

    # The stack to keep track of opening brackets.
    stack = []

    # Hash map for keeping track of mappings. This keeps the code very clean.
    # Also makes adding more types of parenthesis easier
    mapping = {")": "(", "}": "{", "]": "["}

    # For every bracket in the expression.
    for char in s:

    # If the character is an closing bracket
    if char in mapping:

    # Pop the topmost element from the stack, if it is non empty
    # Otherwise assign a dummy value of '#' to the top_element variable
    top_element = stack.pop() if stack else '#'

    # The mapping for the opening bracket in our hash and the top
    # element of the stack don't match, return False
    if mapping[char] != top_element:
    return False
    else:
    # We have an opening bracket, simply push it onto the stack.
    stack.append(char)

    # In the end, if the stack is empty, then we have a valid expression.
    # The stack won't be empty for cases like ((()
    return not stack

    复杂度分析

    • 时间复杂度:O(n),因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1) 的推入和弹出操作。
    • 空间复杂度:O(n),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((
  • 相关阅读:
    我爬取了爬虫岗位薪资,分析后发现爬虫真香
    红薯,撑起父亲的快乐,让我揪心
    跨域问题服务端解决办法 Request header field Authorization is not allowed by Access-Control-Allow-Headers
    antdvue2.x 使用阿里iconfont自定义组件iconfont
    前端 crypto-js aes 加解密
    jsencrypt加密解密字符串
    CryptoJS base64使用方法
    客户端js生成rsa 密钥对
    js动态添加style样式
    PHP 使用非对称加密算法(RSA)
  • 原文地址:https://www.cnblogs.com/rsapaper/p/10798429.html
Copyright © 2011-2022 走看看