Day08
T20 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
- 栈 + 哈希表
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if(n % 2 == 1) return false;
//建立一个哈希表,第一个char为key,第二个char为value
unordered_map<char,char> pairs =
{
{')', '('},//哈希表映射的右括号为键,左括号为值
{']', '['},
{'}', '{'}
};
stack<char> stk;//栈中存入左括号
//检测字符串s的括号匹配情况
for(char ch : s)//增强for循环
{
if(pairs.count(ch))//pairs.count()用于查找键,若该键存在,则返回1,若不存在,则返回0
{
//ch为右括号,因为键都为右括号
if(stk.empty() || stk.top() != pairs[ch])//栈中是否有括号 或 栈顶与ch右括号不匹配
{
return false;
}
stk.pop();//栈顶出栈
}
else{
//ch为左括号
stk.push(ch);//入栈
}
}
return stk.empty();//若遍历完没有false,并且栈为空,则说明有效
}
};
学习感悟
-
string.size求字符串长度
-
unordered_map 容器:无序的map容器
#include <unordered_map> using namespace std;
-
以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改
-
使用[]操作符来访问key值对应的value值,pairs[ch]
-
-
stack栈用法
#include<stack>//头文件 stack<int> q; //以int型为例 int x; //常用操作: q.push(x); //将x压入栈顶,括号内需要有变量 q.top(); //返回栈顶的元素 q.pop(); //删除栈顶的元素 q.size(); //返回栈中元素的个数 q.empty(); //检查栈是否为空,若为空返回true,否则返回false