目录
1.题目解析
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
题目示例给的很明确,首先本题需要判断括号是否数目一样,其次位置是否对称,所以奇数的s就首先排除掉,retur一个false,那怎么处理s呢?应该是用栈来解决,但是因为自己对栈不熟悉,查看了题解,最后做了出来。
2.代码提交
class Solution {
public:
bool isValid(string s) {
//判断是否是奇数
if(s.size() % 2 == 1)
{
return false;
}
//建立一个哈希表
unordered_map<char,char> strs =
{
{')','('},
{']','['},
{'}','{'}
};
//新建一个栈
stack<char> stk;
//增强型for循环
for(char ch:s)
{
if(strs.count(ch))
{
//如果栈为空,或者栈顶括号与ch不一样就false,否则弹出
if(stk.empty() || stk.top() != strs[ch])
{
return false;
}
stk.pop();
}
else{
stk.push(ch);
}
}
return stk.empty();
}
};
最后完美通过!
3.知识点解析
3.1.哈希表
这里参考了一篇文章,解释得很清楚一文解释哈希表
最近瞎逛页发现了一篇很不错的解释,可以看这里哈希表代码版解释
哈希表的new就是这样啦,后面要是需要再单独写一篇记录
unordered_map<type,type> hashmap ={};
3.2.栈
栈也很重要!!!
好多解法都用到了栈,还是得认真学习一下啊!
首先注意两个点,栈是先进后出原则,然后只能对栈顶进行操作
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值
s.push(); //将元素压入栈顶
好啦,具体的概念解释也会单独出一篇文章啦嘻嘻~
3.3.增强型for循环
之前没有见过感觉好厉害的样子,查了一下资料,简单了解,在这里进行记录一下,基本的语法格式如下:
for(type element: arrays)
{
System.out.println(element);
}
其中type为arrays的类型(例如string,int,double,float),element是被声明的新的局部变量,对应的是数组或集合中的每个元素值。arrays即是要访问的数组名。简单说一下,就是下面这样啦!
for(char ch:s)
{
//针对ch的遍历
}
需要值得注意的是,
1.迭代器iterator遍历元素与增强型for变量元素区别:使用迭代器iterator遍历集合元素时可以删除集合的元素,但是增强型for循环遍历集合元素时,不能调用迭代器的remove()方法删除对应下标元素。
2.普通for循环和加强型for循环差别:普通for循环可以没有遍历目标,但加强型for循环必须要有遍历目标。