📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|第 54 题(1)

📅  最后修改于: 2023-12-03 14:58:33.864000             🧑  作者: Mango

题目描述

给定一个字符串,包含 '('')''{''}''['']' 六种不同的字符,请编写一个函数,检查这个字符串是否是有效的。

字符串是有效的,当且仅当:

  • 所有的括号都是正确的。即每个左括号都必须有与之对应的右括号。
  • 括号必须以正确的顺序出现。即一个左括号必须先于相应的右括号。

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

示例 1

输入:"()"

输出:true

示例 2

输入:"()[]{}"

输出:true

示例 3

输入:"(]"

输出:false

示例 4

输入:"([)]"

输出:false

示例 5

输入:"{[]}"

输出:true

解题思路

使用栈来存储左括号,遇到右括号时判断栈顶是否匹配。

具体来说,每次遇到一个括号时,如果它是左括号,则把它压入栈中;如果它是右括号,则判断它是否和栈顶元素匹配,如果匹配则弹出栈顶元素,否则返回 false

最后,如果栈为空,则说明所有括号都匹配,返回 true,否则返回 false

代码实现

下面是使用 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

下面是使用 Java 语言实现的完整代码片段:

import java.util.Stack;

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else if (c == ')' && !stack.empty() && stack.peek() == '(') {
                stack.pop();
            } else if (c == ']' && !stack.empty() && stack.peek() == '[') {
                stack.pop();
            } else if (c == '}' && !stack.empty() && stack.peek() == '{') {
                stack.pop();
            } else {
                return false;
            }
        }
        return stack.empty();
    }
}

下面是使用 C++ 语言实现的完整代码片段:

#include <stack>
#include <string>

using namespace std;

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for (char c : s) {
            if (c == '(' || c == '[' || c == '{') {
                stk.push(c);
            } else if (!stk.empty()) {
                char top = stk.top();
                if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {
                    stk.pop();
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }
        return stk.empty();
    }
};