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),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/rsapaper/p/10798429.html
Copyright © 2011-2022 走看看