给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例:
输入:s = "{[]}" 输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
利用栈解题
注意:我们需要判定符号是成对出现的,若s = "([)]",我们栈中的元素按放入的顺序看为'(', '[', 而此时来了 ')' 符号,不满足我们需要的 ']'符号,返回错误。
Ⅰ.计算传入的字符串s的大小n,如果n是奇数,直接返回false
Ⅱ.n为偶数的情况下,创建一个unordered_map<char,int> map,用来存放要判断的符号,以符号为key,将他们的编号设置为value。
unordered_map<int,int> map={
{'(',1},
{'[',2},
{'{',3},
{')',4},
{']',5},
{'}',6}
};
Ⅲ.创建一个存放我们遍历s得到的字符
stack<char> stk;
Ⅳ.当往stk中放入数据的时候,判断数据对应的value是否>=1并且<=3,满足此条件,说明放入栈中的满足符号的左条件,即符号为 '(', '[', '{' 三者中的一种
Ⅵ.如果往stk中放入数据的时候,栈不为空,并且满足
map[stk.top()]==flag-3
说明放入栈中的满足符号的右条件,即符号为 ')', ']', '}' 三者中的一种
Ⅶ.如果上述两种条件都不满足,返回false
Ⅷ.遍历完s后,判断此时栈是否为空,如果为空返回true,否则返回false
完整代码
class Solution {
public:
bool isValid(string s) {
int n=s.size();
if(n%2==1){
return false;
}
unordered_map<int,int> map={
{'(',1},
{'[',2},
{'{',3},
{')',4},
{']',5},
{'}',6}
};
stack<char> stk;
for(char cur:s){
int flag=map[cur];
if(flag>=1&&flag<=3){
stk.push(cur);
}
else if(!stk.empty()&&map[stk.top()]==flag-3){
stk.pop();
}
else{
return false;
}
}
if(!stk.empty()){
return false;
}
return true;
}
};