📜  数据结构 |堆栈 |问题 4(1)

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

数据结构 | 堆栈 | 问题 4

该问题是什么?

在一个给定的字符串中,判断括号的使用是否正确配对,即左括号与相应的右括号是否匹配。 例如,字符串 "()[{}]" 中的括号就是正确的匹配对,而 "([)]" 则不是。

如何解决该问题?

可以使用堆栈(stack)数据结构来解决该问题。 我们可以遍历字符串的每个字符,如果是左括号,则将其压入堆栈中;如果是右括号,则弹出堆栈顶部的元素,并判断其是否与当前字符匹配。 如果是匹配的,则继续遍历字符串;如果不匹配,则说明字符串中的括号不是正确配对的。

以下是一个示例代码,该代码使用 Python 语言编写:

def is_valid(s: str) -> bool:
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in s:
        if char in mapping:
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:
                return False
        else:
            stack.append(char)
    return not stack

其中,stack 变量表示堆栈,mapping 变量是一个字典,用于存储右括号与相应左括号的对应关系。 遍历字符串 s 中的每一个字符,对于每个字符 char,如果其在 mapping 中,则说明其为右括号,我们需要将堆栈顶部的元素弹出,并判断其是否与 char 匹配。 如果不匹配,则说明字符串中的括号不是正确配对的;否则,我们继续遍历字符串。 遍历结束后,如果堆栈为空,则说明字符串中的所有括号都是正确配对的;反之,则说明字符串中存在未匹配的括号。

时间复杂度分析

该算法的时间复杂度为 $O(n)$,其中 $n$ 是字符串的长度。 在遍历字符串的过程中,我们每个字符可能需要进出堆栈一次,因此时间复杂度为 $O(n)$。 同时,由于我们只使用了一个堆栈,因此空间复杂度为 $O(n)$。