力扣每日一题之有效的括号
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
空字符串也算是有效。
算法思路
首先需要思考的应该是暴力解法;
然后是尝试寻找示例,找规律
进行模式识别:发现先进后出的特征,那应该要用栈的方法来解决。
用栈和哈希表解决
代码:
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
unordered_map <char,char> pairs ={
{')','('},
{']','['},
{'}','{'}
};
/* if(s == "")
{
return false;
}*/
int n = 0;
n = stk.size();
if(n % 2 == 1)//为奇数
{
return false;
}
else
{
for(char ch:s) //for (auto ch:s)
{
//如果是右括号便查看栈顶
if(pairs.count(ch))
{
//查看栈顶是否为对应的左括号
if(stk.empty()||stk.top()!=pairs[ch])
{
return false;
}
else
{
stk.pop();
}
}
else
{
stk.push(ch);
}
}
}
return stk.empty();
}
};
题目标签
栈、后进先出、字符串
刷题总结
对先进后出的特征要有灵敏的触感,在暴力拆开和举例子的时候,要能发现数据是先进后出的,问题已经解决一大半了,然后再搭配上STL库的一些编程技巧。