给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
参考思路:
括号消除最先想到的方法一定是栈,先试用map哈希表处理一下括号,分别表示为1-6;
遍历string s 这里使用char c:s是学习到的新用法,如果对应哈希表是1-3则表明是括号的左半部分,直接入栈;
如果 这时的元素是右半括号,若对应哈希值减三(右括号对应的左括号) 等于 栈顶元素对应的哈希值,那就出栈,这是要注意,该情况必须确保栈非空,否则访问报错,注意两个条件判空放在前面,第一个满足了才会继续判断&&后面的条件,不然直接跳出,到else 也就是不符合情况。
最后再判断一下是否栈中的元素全部推出。
参考代码:
class Solution {
public:
bool isValid(string s) {
bool flag=true;
unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},{')',4},{']',5},{'}',6}};
stack<char> st;
for(char c:s){
if(m[c]>=1&&m[c]<=3){
st.push(c);
}
else if(!st.empty()&&m[st.top()]==m[c]-3){
st.pop();
}
else{
flag=false;
break;
}
}
if(!st.empty())
flag=false;
return flag;
}
};