有效的括号
题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例
输入:s = "()[]{}"
输出:true输入:s = "()"输出:true
输入:s = "([)]"
输出:false
输入:s = "{[]}"
输出:true
解题方法及思路
第一次写没做出来,参考了官方解题思路。
最主要的知识点就是用到了栈(先入后出)还有哈希表即键值对(判断括号是否匹配)的思想
class Solution {
public:
bool isValid(string s) {
int length= s.size();
//如果字符长度为奇数,则该字符串肯定无效
if((length&1)==1)
{
return false;
}
//创建一个可存储 <char,char> 类型键值对的 unordered_map 容器
//参考http://c.biancheng.net/view/7231.html
unordered_map<char,char> umap{
{')','('},
{'}','{'},
{']','['},
};
//创建栈存储遇到的左括号( { [
stack <char> stk;
//for循环遍历字符串s,这种for循环是C++新标准中的用法
//参考http://c.biancheng.net/view/7759.html
for(char ch:s)
{
if(umap.count(ch))//如果遇到右括号,判断是否匹配
{
//若遇到右括号时栈为空或栈顶左括号与该右括号对应的键值不相等则为false
if(stk.empty()||stk.top()!=umap[ch])
{
return false;
}
else
{
stk.pop();//如果匹配则令栈顶的左括号出栈
}
}
else//如果遇到左括号则存到栈里
{
stk.push(ch);
}
}
return stk.empty();//最后判断栈是否为空,即所有括号是否匹配
}
};