难度:简单
目录
一、问题描述
这里直接采用的是LeetCode上面的问题描述。
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
下面给出示例:
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
二、思路
1、解题思路
使用数据结构 栈 完成括号的匹配,遍历 字符串 s ,因为提示中说了,字符串 s 仅由括号'()[]{}'
组成,所以当字符分别为:' ( '、' [ '、' { ' 时,才入栈,否则应该判断是否进行出栈操作。
出栈的情况有三种:
- 当栈顶元素为 ' ( ',且当前字符为 ' ) '时;
- 当栈顶元素为 ' [ ',且当前字符为 ' ] '时;
- 当栈顶元素为 ' { ',且当前字符为 ' } '时。
否则的话即进行入栈操作。
结尾判断栈 是否为空,即 括号 是否一一匹配,空的话说明为 有效的括号 否则就不是。
有这么一些特殊情况可以单独拎出来:
- 当字符串 s 的大小为 单数 时,括号肯定不能一一匹配;
- 当判断 右括号 时,栈为空,则括号肯定不能一一匹配;
- 当判断 右括号 时,不能进行 出栈 操作,则括号肯定不能一一匹配。
以上三种情况,都可以直接说明字符串 s 不是 有效的括号。
2、极端情况的判断
在最上述特殊情况进行操作的时候,解决了极端情况。
3、解决极端情况
在特殊情况中解决极端情况。
三、解题
1、代码实现
class Solution {
public:
bool checkStackTop(char c){
//栈为空说明没有 左括号 入栈 说明最少会有两个括号不能够匹配
if(p.empty()){
return true;
}
char temp = p.top();
if(c == ')' and temp == '('){
p.pop();
return false;
}else if (c == ']' and temp == '['){
p.pop();
return false;
}else if(c == '}' and temp == '{'){
p.pop();
return false;
}
// 如果不能出栈的话 则说明最少会有两个括号不能够匹配
else{
return true;
}
}
bool isValid(string s) {
// 括号数为单数 则肯定不能完全匹配
if(s.size() % 2 ){
return false;
}
for(char& item: s){
if(item == '(' or item == '{' or item == '['){
p.push(item);
}
else{
if(checkStackTop(item)){
return false;
}
}
}
return p.empty();
}
private:
stack<char> p;
};
2、时间复杂度 and 空间复杂度
时间复杂度:,n 为字符串 s 的大小
空间复杂度:
四、总结
这一题还是比较经典的题目,以前只会盲目的 进栈 出栈 ,现在优化了一些特殊情况,可以提高效率 和 降低 栈使用的空间。