目录
1.题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
2.算法思路:
-
使用栈数据结构:
- 栈的“先进后出”特性非常适合处理括号匹配问题。遇到左括号时压入栈,遇到右括号时弹出栈顶元素并检查是否匹配。
-
遍历字符串:
- 从左到右依次遍历字符串中的每个字符。
-
处理左括号:
- 如果当前字符是左括号(
'('
,'{'
,'['
),则将其压入栈中。
- 如果当前字符是左括号(
-
处理右括号:
- 如果当前字符是右括号(
')'
,'}'
,']'
),则检查栈是否为空:- 如果栈为空,说明没有对应的左括号,直接返回
false
。 - 如果栈不为空,弹出栈顶的左括号,并检查是否与当前右括号匹配:
- 如果不匹配(例如栈顶是
'('
而当前是'}'
),则返回false
。
- 如果不匹配(例如栈顶是
- 如果栈为空,说明没有对应的左括号,直接返回
- 如果当前字符是右括号(
-
最终检查:
- 遍历完所有字符后,检查栈是否为空:
- 如果栈为空,说明所有括号都匹配成功,返回
true
。 - 如果栈不为空,说明有未匹配的左括号,返回
false
。
- 如果栈为空,说明所有括号都匹配成功,返回
- 遍历完所有字符后,检查栈是否为空:
3.代码展示:
bool isValid(string s) {
//括号匹配,用栈的特性先进先出
stack<char>st;
for (const auto ch : s) {
//遇到左括号,就压入栈中
if (ch == '{' || ch == '(' || ch == '[') {
st.push(ch);
}
else
{
//如果栈为空就直接返回false
if (st.empty()) {
return false;
}
//取出栈顶元素
char cmp = st.top();
//删除栈顶元素
st.pop();
if (ch == ')' && cmp != '(' || ch == '}' && cmp != '{' || ch == ']' && cmp != '[') {
return false;
}
}
}
//如果此时,栈中为空,说明全部比配成功
return st.empty();
}
20. 有效的括号 - 力扣(LeetCode)https://leetcode.cn/problems/valid-parentheses/description/