力扣20:有效的括号
题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
输入输出样例
输入:s = "()"
输出:true
输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false
输入:s = "([)]"
输出:false
输入:s = "{[]}"
输出:true
算法一,使用hash表存储
本题最适合的就是采用堆栈来实现,左括号入栈,右括号跟栈顶匹配,匹配成功则出栈,匹配不成功直接返回false
//使用hash来存储
bool isValid(string s)
{
stack<char>sta;
//建立匹配的map结构
unordered_map<char,char>array={
{')','('},
{']','['},
{'}','{'}
};
//遍历字符串
for(auto i:s)
{
//根据hash的count判断是否存在
//也可用find函数进行替代
if(array.count(i))
{
//当堆栈的列表为空的时候,或则栈顶元素与当前hash表中元素的值不匹配的时候则跳出
if(sta.empty()||sta.top()!=array[i])
{
return false;
}
sta.pop();
}
else{
sta.push(i);
}
}
if(sta.empty())
{
return true;
}
else{
return false;
}
}
算法2,用if条件判断来实现
//不使用hash进行存储
bool isValid2(string s)
{
stack<char>stk;
for(auto i:s)
{
if(!stk.empty())
{
char t=stk.top();
if((t=='['&&i==']')
||(t=='('&&i==')')
||(t=='{'&&i=='}'))
{
stk.pop();
continue;;
}
}
stk.push(i);
}
return stk.empty();
}
};