题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例
输入:s = "()"
输出:true
输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false
思路
这是一个常见的括号匹配问题,可以通过使用栈来解决。具体方法如下:
- 创建一个空栈。
- 从左到右依次遍历字符串中的每个字符。
- 如果当前字符是左括号(‘(’,‘{’,‘[’),则将其压入栈中。
- 如果当前字符是右括号(‘)’,‘}’,‘]’),则检查栈顶元素是否与之匹配:
- 若栈为空,则返回 False,因为此时右括号没有对应的左括号。
- 若栈顶元素与当前右括号不匹配,则返回 False。
- 若匹配,则将栈顶元素弹出,继续检查下一个字符。
- 遍历完整个字符串后,若栈为空,则返回 True,否则返回 False。
Code
class Solution {
public:
bool isValid(string s) {
stack<char>st;
unordered_map<char,char> mapping ={{'(',')'},{'{','}'},{'[',']'}};
for(int i=0;i<s.size();i++)
{
if(st.empty()||mapping.find(s[i]) != mapping.end())
{
st.push(s[i]);
}
else
{
if(mapping[st.top()] != s[i])
return false;
else st.pop();
}
}
return st.empty();
}
};