1.题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
2.代码
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if(n % 2 == 1)//奇数的话直接不会完美匹配的
{
return false;
}
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};//利用哈希表,将右括号作为键
stack<char> sta;//用栈
for(char c : s)//循环遍历字符串s,并且这里是将字符串复制给了c
{
if( pairs.count(c))//在哈希表中查找来检验这个字符是不是右括号
{
if( sta.empty() || sta.top() != pairs[c])//栈空的话或者栈顶元素和此处右括号不匹配
{
return false;
}
sta.pop();//匹配的话将栈顶元素弹出去
}
else
{
sta.push(c);//不是右括号即为左括号,入栈
}
}
return sta.empty();//全部遍历完之后,栈空了的话就true,不空则false
}
};
3.注意点
1.越往后的左括号越要先匹配,所以采用栈的数据结构
2.利用哈希表来存对应的左右括号,以此来进行匹配
3.此处哈希表、栈、c三者数据类型要统一
4..count()的作用是搜索某个键是否存在于哈希集内,即如果该字符是右括号,if的括号内才为1,然后继续执行
5.for(char c : s)是循环遍历字符串s,并且这里是将字符串复制给了c
6.关于if之后是否要写else,如果if里有出口,无需写else;若没有,则必须写else,否则会顺序执行本应在else里面的语句