⭐今日份题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
每个右括号都有一个对应的相同类型的左括号。
示例1
输入:s = "()" 输出:true
示例2
输入:s = "()[]{}" 输出:true
示例3
输入:s = "(]" 输出:false
提示
-
1 <= s.length <= 104
-
s
仅由括号'()[]{}'
组成
⭐题目思路
这里还是提取一下题目的特征点:
-
闭合
-
按顺序
-
每个左(右)对应一个右(左)
先考虑明面上的错误情况:
-
只有左(右)
-
左右不对应
解题思路是使用栈,栈的特点是先进后出,完全符合该模式。⭐基本过程是:当我们遇到左括号时,将其压入栈;遇到右括号时,从栈中取出一个符号看是否配对就好。
深入来看,还要考虑括号嵌套问题,不需要担心当前右括号需要跨越几个正常的括号组才能找到左括号的问题,如 " { [ ] ) " ,因为,正常的括号组一定早已经经历了配对,所以每次只需要判断栈顶的是否是对应的左括号就好。
该题目是栈相关的简单、经典题目,初学的同学们可以多看几遍,多做几次。
⭐stack补充知识
这里再简单补充一下STL中stack的使用方法。
栈是先进后出,后进先出的数据结构,使用方法主要包括:
//声明
stack<int> s;
//指定底层容器的栈
stack<int,vector<int> > s;
//入栈
s.push(1);
//访问栈顶
s.top();
//从栈顶清除一个元素(只能从栈顶清除)
s.pop();
//判断栈中是否还有元素
s.empty();//无元素的话,empty函数会返回true
//判断栈的元素数量
s.size();
//清空栈中的元素
for(int i=s.size();i;i--) s.pop();
⭐代码
class Solution
{
public:
bool isValid(string s)
{
stack<char> p;
for(int i=0;i<s.size();i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{') p.push(s[i]);
else if(s[i]==')')
{
if(p.empty()) return false;
char cur=p.top();
p.pop();
if(cur!='(') return false;
}
else if(s[i]==']')
{
if(p.empty()) return false;
char cur=p.top();
p.pop();
if(cur!='[') return false;
}
else if(s[i]=='}')
{
if(p.empty()) return false;
char cur=p.top();
p.pop();
if(cur!='{') return false;
}
}
if(!p.empty()) return false;
return true;
}
};
提交结果
我的代码的内存消耗还有待改进,欢迎大家提供更高效的代码,如果过后有更优化的思路我还会继续更新的,大家评论区见!
点赞收藏不迷路⭐~