返回
LeetCode 第20题(有效括号) 解题思路与Python/C++代码解析
前端
2023-10-22 04:32:05
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题“有效括号”问题的分析和代码实现,我们掌握了栈数据结构的应用技巧,并加深了对栈算法原理的理解。栈作为一种重要的数据结构,在许多编程场景中发挥着重要的作用,希望读者能够灵活应用栈,解决更复杂的编程问题。