📜  门| GATE-CS-2004 |第 63 题(1)

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

题目描述

给定一个由'(',')','{','}','['和']'组成的字符串,编写一个函数来检查该字符串是否有效。

有效字符串需满足:

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

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

示例

示例1:

输入: "()"
输出: true

示例2:

输入: "()[]{}"
输出: true

示例3:

输入: "(]"
输出: false

示例4:

输入: "([)]"
输出: false

示例5:

输入: "{[]}"
输出: true

解题思路

这是一道很经典的栈的使用题目。栈是一种先进后出的数据结构,在这道题中我们可以使用栈来解决。

首先我们先对字符串进行遍历,同等级开口的字符入栈,遇到同等级闭合的字符时出栈。若遇到不同等级的闭合字符无法出栈,或者遍历完字符串后栈中还有字符未被匹配完全,则说明字符串无效。

代码实现

Python 代码
class Solution:
    def isValid(self, 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
Java 代码
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (char c : s.toCharArray()) {
            if (c == '(')
                stack.push(')');
            else if (c == '{')
                stack.push('}');
            else if (c == '[')
                stack.push(']');
            else if (stack.isEmpty() || stack.pop() != c)
                return false;
        }
        return stack.isEmpty();
    }
}
C++ 代码
class Solution {
public:
    bool isValid(string s) {
        stack<char> paren;
        for (auto c : s) {
            if (c == '(' || c == '[' || c == '{')
                paren.push(c);
            else if (paren.empty())
                return false;
            else if (c == ')' && paren.top() == '(' || c == ']' && paren.top() == '[' || c == '}' && paren.top() == '{')
                paren.pop();
            else
                return false;
        }
        return paren.empty();
    }
};

复杂度分析

本题时间复杂度为O(n),n为字符串的长度,因为字符串只会遍历一遍。

空间复杂度为O(n),在最坏情况下,栈的深度最大为n。