20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
做题思路
将字符串遍历,将符号‘(’ 对应的 ‘)’、‘{’ 对应的 ‘}’ 、‘[’ 对应的 ‘ ]’ 插入栈中,遍历字符串,如果找到字符 ‘)’或 ‘}’ 或 ‘]’ ,若在栈顶,则将该字符从栈中踢出,否则输出false ;若将字符串遍历完后,如果栈中不为空,则输出false。
解题代码及注释:
class Solution {
public:
bool isValid(string s) {
unordered_map<char,char> p={{'(',')'},{'[',']'},{'{','}'}}; //记录符号的匹配关系
stack<char> stk; //定义一个栈
for(int i=0;i<s.length();i++) //遍历整个字符串
{
if(p.find(s[i])!=p.end()) //如果当前遍历到的是一个左括号的话,将其对应的右括号放入栈中
{
stk.push(p[s[i]]);
}
else //否则就是右括号,就将其与栈顶符号相匹配
{
if(stk.empty()||stk.top()!=s[i])//如果不匹配,就输出false
{
return false;
}
stk.pop(); //如果匹配,就将栈顶符号弹出
}
}
return stk.empty(); //最终若栈为空则为true
}
};