返回

LeetCode 第20题(有效括号) 解题思路与Python/C++代码解析

前端

LeetCode 20:有效括号

LeetCode第20题“有效括号”要求判断一个由括号组成的字符串是否有效。有效括号是指左右括号相互匹配,并且左右括号的顺序是正确的。

例如:

"()"  // 有效
"(})" // 无效
"()[]{}"  // 有效
"([)]" // 无效

解题思路

有效括号问题的本质是配对关系,我们可以使用栈数据结构来辅助解决这个问题。

思路是遍历字符串,对于出现的每一个左括号,将其压入栈中;对于出现的每一个右括号,将其与栈顶的左括号进行比较,如果匹配则将栈顶的左括号弹出,否则返回false。

最后,如果栈为空,则说明所有括号都已配对成功,返回true;否则,返回false。

Python代码示例

def is_valid(s):
  """
  判断一个字符串是否包含有效括号。

  参数:
    s:字符串

  返回:
    布尔值
  """

  # 创建一个栈来存储左括号
  stack = []

  # 遍历字符串中的每个字符
  for char in s:
    # 如果是左括号,将其压入栈中
    if char in ["(", "[", "{"]:
      stack.append(char)

    # 如果是右括号
    elif char in [")", "]", "}"]:
      # 如果栈为空,说明右括号没有与左括号配对,返回false
      if not stack:
        return False

      # 将栈顶的左括号弹出
      left = stack.pop()

      # 如果右括号与左括号不匹配,返回false
      if (char == ")" and left != "(") or \
         (char == "]" and left != "[") or \
         (char == "}" and left != "{"):
        return False

  # 如果栈为空,说明所有括号都已配对成功,返回true
  if not stack:
    return True

  # 否则,返回false
  else:
    return False


# 测试
print(is_valid("()"))  # True
print(is_valid("([])"))  # True
print(is_valid("([{}])"))  # True
print(is_valid("([)]"))  # False
print(is_valid("{[]}"))  # True
print(is_valid("{[)}"))  # False

C++代码示例

#include <stack>
#include <iostream>
#include <string>

using namespace std;

bool is_valid(string s) {
  // 创建一个栈来存储左括号
  stack<char> stack;

  // 遍历字符串中的每个字符
  for (char c : s) {
    // 如果是左括号,将其压入栈中
    if (c == '(' || c == '[' || c == '{') {
      stack.push(c);
    }

    // 如果是右括号
    else if (c == ')' || c == ']' || c == '}') {
      // 如果栈为空,说明右括号没有与左括号配对,返回false
      if (stack.empty()) {
        return false;
      }

      // 将栈顶的左括号弹出
      char left = stack.top();
      stack.pop();

      // 如果右括号与左括号不匹配,返回false
      if ((c == ')' && left != '(') ||
          (c == ']' && left != '[') ||
          (c == '}' && left != '{')) {
        return false;
      }
    }
  }

  // 如果栈为空,说明所有括号都已配对成功,返回true
  if (stack.empty()) {
    return true;
  }

  // 否则,返回false
  else {
    return false;
  }
}

int main() {
  // 测试
  cout << is_valid("()") << endl;  // True
  cout << is_valid("([])") << endl;  // True
  cout << is_valid("([{}])") << endl;  // True
  cout << is_valid("([)]") << endl;  // False
  cout << is_valid("{[]}") << endl;  // True
  cout << is_valid("{[)}") << endl;  // False

  return 0;
}

总结

通过对LeetCode第20题“有效括号”问题的分析和代码实现,我们掌握了栈数据结构的应用技巧,并加深了对栈算法原理的理解。栈作为一种重要的数据结构,在许多编程场景中发挥着重要的作用,希望读者能够灵活应用栈,解决更复杂的编程问题。