📜  门| GATE CS 1997 |问题25(1)

📅  最后修改于: 2023-12-03 15:42:10.691000             🧑  作者: Mango

门 | GATE CS 1997 |问题25

该问题是GATE CS 1997年的问题25。这是一个经典的计算机科学问题,根据条件判断一个字符串是否是有效的括号序列(例如,{},[],()等等)。

问题描述

给定一个只包含字符{,},[,]和(,)的字符串,判断它是否是有效的括号序列。一个有效的括号序列定义如下:

  1. 空字符串是有效的
  2. 如果一个字符串是有效的,那么对于任何左括号,它都必须有一个相应的右括号
  3. 相应的右括号必须在左括号之后出现
  4. 括号序列中的子序列也必须是有效的

例如,{},[],()是有效的括号序列,但是{[)]是无效的。

解决方案

该问题可以使用堆栈来解决。

我们遍历给定的字符串,对于每个左括号,将其推入堆栈中。对于每个右括号,我们将检查堆栈的顶部是否与相应的左括号匹配。如果是,我们将堆栈弹出,否则该字符串无效。如果我们已经遍历完了整个字符串,并且堆栈为空,则该字符串有效,否则无效。

下面是该问题的解决方案的Python代码:

def is_valid_parenthesis(string):
    stack = []
    for char in string:
        if char in ['(', '[', '{']:
            stack.append(char)
        else:
            if not stack:
                return False
            if char == ')' and stack[-1] != '(':
                return False
            if char == ']' and stack[-1] != '[':
                return False
            if char == '}' and stack[-1] != '{':
                return False
            stack.pop()
    return not stack
性能

该算法的时间复杂度为O(n),其中n是字符串的长度,因为我们只需遍历一次字符串。

该算法的空间复杂度为O(n),因为最坏的情况下,我们需要存储所有左括号。

结论

该问题是经典的计算机科学问题。我们可以使用一个简单的堆栈算法来解决它。该算法的时间复杂度为O(n),其中n是字符串的长度,空间复杂度为O(n)。