大四太无聊了,了解一下这面知识,看过c++网课觉得眼睛和脑子各干各的,还是边做题边学习吧。这题会用到栈和哈希表的知识。在此记录梳理菜鸡的做题过程。
{()【()】}对于这种复杂括号 ,要怎么判断是否匹配呢。
一个左括号一定要有一个右括号与其匹配但不一定会紧接着这个左括号,且后出现的待匹配的左括号需要先匹配,即后进先出,这就很好地符合栈。
一、栈
栈(Stack):是只允许在一端进行插入或删除的线性表,是一种“先进后出”的容器。
涉及的代码(比较懒 用啥学啥 不用的以后有机会再学 下次一定)
stack<char> stk; (建个栈吧
stack.push(elem); //往栈头添加元素 (遇见左括号进栈
stack.pop(); //从栈头移除第一个元素 (匹配了的左括号出栈
stk.empty() (最后全部匹配完若栈为空则true 若由剩余未匹配的则false
二.哈希表
经过我浅薄敷衍的了解嗯
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
菜鸟理解,哈希表(key value) key 通过哈希函数数字 将这个数字作为散列表的下标,并存入对应的value值 。
额至于这个哈希函数是怎么满足key一一对应且不冲突之类的与题无关懒狗就不去了解了。。。
当采用朴素查找时,查找值key为3,我们就要通过遍历整个数组来寻找数组是否有我们的Key,假设一共有N个元素,那么它的时间复杂度为O(n)。
如果遍历到了Key值则返回1,如果没有查找到则返回0.
哈希表会提高查找的效率 也就是说我们不必从头到尾地遍历去查找是否有某个元素
我们只需要输入key 通过哈希函数得到下标 以及对应的value值就可以知道。
哈希表帮助我们快捷地查找,而栈是确定正确的查找顺序,如前面所讲,待匹配中后面的先匹配,栈可以帮我们实现这个匹配顺序。遇见左括号入栈,遇见右括号则匹配栈顶的元素,
c++相关
unordered_map<char, char> pairs = { //建立一个哈希表,第一个char为key,第二个char为value
{')' , '(' }, //哈希表映射的右括号为键,左括号为值
{']' , '[' },
{'}' , '{' }
};
代码实现
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
} //判断 若是奇数直接false
unordered_map<char, char> pairs = {//建立一个哈希表(key,value)由key得到散列表下标存入value
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk; //建立栈
for (char ch: s) { //遍历整个字符串
if (pairs.count(ch)) { //pairs.count()查找键,若为右键,则匹配
if (stk.empty() || stk.top() != pairs[ch]) { //栈已经空了 没有相匹配的//栈顶的左括号不等于由右括号对应的value左括号
return false;
}
stk.pop(); //若相同,则将栈中的括号抛出
}
else { //若为左括号
stk.push(ch); //若当前的字符为左括号则将当前字符记入栈中
}
}
return stk.empty(); //若遍历完没有false,并且栈为空,则说明有效
}
};
嗯就是这样。。。