LeetCode刷题记录----20.有效的括号(Easy)
2025/9/7
20. 有效的括号
题目(Easy):
我的思路:
因为每一个右括号一定需要一个左括号来对应配对,且当右括号出现的时候需要马上进行这个匹配,而要进行匹配的是当前最后一个左括号。因此我们可以考虑使用栈的数据结构来处理这一过程。即:
①当前字符为左括号则直接入栈
②当前字符为右括号则和栈顶元素进行匹配,查看是否为目标的左括号(如果不存在栈顶元素那直接为false)
③最后都匹配完成的话栈应该是空
因此,大致的代码如下:
class Solution {
public:bool isValid(string s) {//左括号直接入栈,右括号和当前栈顶括号比较vector<char> stack;for(int i = 0; i < s.size(); i++){char c = s[i];if(c == '(' || c == '[' || c == '{'){//直接压入stack.emplace_back(c);}else{//先看栈顶还有没有if(stack.size() == 0)return false;char top = stack.back();stack.pop_back();if((c == ')' && top != '(') ||(c == ']' && top != '[') ||(c == '}' && top != '{')){return false;}}}return stack.size() == 0;}
};
时间复杂度:O(N)【需要遍历整个字符串】
空间复杂度:O(N)【最坏的情况下全部是左括号,都要入栈】
优化思路:
这里优化主要就是对初始字符串和匹配的过程进行优化。
初始字符串如果是奇数的话,那肯定完不成匹配,所以不用进入后续的判断
匹配的时候我们用一个初始的哈希表来进行左右括号的区分与匹配
同时我们可以用C++内部定义好的真的栈
具体代码如下:
class Solution {
public:bool isValid(string s) {//左括号直接入栈,右括号和当前栈顶括号比较int n = s.size();//如果长度为奇数的话那肯定配对失败了if(n % 2 != 0)return false; //用栈来判断stack<char> stk;//用一个哈希表来快速比对unordered_map<char, char> pairs = {{')', '('},{']', '['},{'}', '{'}};for(const char c : s){if(pairs.count(c)){//判断当前栈是否为空 或者 栈顶元素是否不匹配if(stk.empty() || stk.top() != pairs[c])return false;stk.pop(); //能走到这里说明匹配了,直接弹出栈顶元素}else{//否则肯定是( { [ ,直接压入就好stk.push(c); }}return stk.empty();}
};
时间复杂度:O(N)
空间复杂度:O(N + 字符集长度)【字符集长度是指哈希表占的空间】
总结:
①C++中有定义好了的栈stack,它的查看栈顶元素是stack.top()但是不会弹出,弹出要再手动调用stack.pop()
②这里根据左右括号的匹配特性,可以利用哈希表来让可读性更好一些