前言
记录一下刷题历程 力扣第20题 有效的括号 使用栈
有效的括号
原题目:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([])”
输出:true
分析
我们可以准备一个杯子 假如我们先放入"(“在放入”)“因为是匹配的,所以我们消除,此时这个杯子里是空的,我们可以认为都是有效的括号。假如我们放入一个”(“,再放入一个”[“,在加一个“]”此时“[”和杯子顶“]”是匹配的所以我们消除它,我们再放入一个”}"发现和杯子顶部“(”是不匹配的所以我们返回false 而这个杯子就是栈
代码如下:
class Solution {
public:
bool isValid(string s) {
stack<char> st; // 定义一个字符类型的栈 st,用于存储左括号
for (auto& ch : s) { // 遍历字符串 s 中的每一个字符 ch
if (ch == '(' || ch == '[' || ch == '{') { // 如果字符是左括号
st.push(ch); // 将左括号压入栈中
} else if (!st.empty() && isMatch(st.top(), ch)) { // 如果字符是右括号且栈不为空,并且能与栈顶的左括号匹配
st.pop(); // 弹出栈顶的左括号,表示匹配成功
} else {
return false; // 如果以上条件都不满足,返回 false,说明括号不匹配
}
}
if (st.empty()) { // 如果栈为空,说明所有左括号都找到了匹配的右括号
return true; // 返回 true,表示括号匹配
}
return false; // 否则返回 false,表示有未匹配的左括号
}
bool isMatch(char& left, char& right) {
if (left == '(' && right == ')') {
return true; // 如果 left 是 '(',right 是 ')',返回 true,表示匹配
} else if (left == '[' && right == ']') {
return true; // 如果 left 是 '[',right 是 ']',返回 true,表示匹配
} else if (left == '{' && right == '}') {
return true; // 如果 left 是 '{',right 是 '}',返回 true,表示匹配
} else {
return false; // 否则返回 false,表示不匹配
}
}
};
解释注释
1.stack st;
定义一个 stack 类型的栈 st,用于存储左括号,帮助进行括号匹配的判断。
遍历字符串:
2.for (auto& ch : s) { … }
使用 for 循环遍历字符串 s 中的每一个字符 ch。
3.判断左括号:
if (ch == ‘(’ || ch == ‘[’ || ch == ‘{’) { … }
如果当前字符 ch 是左括号 (、[ 或 {,则将其压入栈 st 中。
4.判断右括号并匹配:
else if (!st.empty() && isMatch(st.top(), ch)) { … }
如果当前字符 ch 是右括号,并且栈 st 不为空,并且 ch 能与栈顶的左括号匹配(通过 isMatch 函数判断),则将栈顶的左括号弹出,表示匹配成功。
5.未匹配情况处理:
else { return false; }
如果 ch 不是左括号且与栈顶的左括号不匹配,则返回 false,表示括号不匹配。
6.最终检查:
if (st.empty()) { return true; }
如果遍历完字符串后栈 st 为空,说明所有左括号都找到了匹配的右括号,返回 true。
return false;
否则返回 false,表示有未匹配的左括号。
7.isMatch 函数:
bool isMatch(char& left, char& right) { … }
isMatch 函数用于判断给定的左右括号是否匹配,根据左括号 left 和右括号 right 的对应关系进行判断,返回 true 表示匹配,返回 false 表示不匹配。
时间复杂度
这段代码利用栈的特性实现了对字符串中括号匹配的检查。通过遍历字符串,将左括号压入栈中,并在遇到右括号时与栈顶的左括号进行匹配,从而判断括号是否正确闭合。这种方法简洁高效,时间复杂度为 O(n),适用于处理括号匹配等问题。