题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
//遍历字符串
for(int i=0; i<s.size(); i++){
//如果是左括号,就将它入栈
if(s[i] == '(') stk.push(')');
else if(s[i] == '{') stk.push('}');
else if(s[i] == '[') stk.push(']');
//否则为右括号,如果此前没有左括号或者它与当前栈顶的左括号不匹配,返回false
else if(stk.empty() || s[i] != stk.top()) return false;
//否则表示匹配
else stk.pop();
}
return stk.empty();//遍历完后如果栈非空表示左括号有剩余
}
};
- 时间复杂度O(n)
- 空间复杂度O(n)
- 思路
- 使用栈,遍历字符串,如果是左括号,就将对应的右括号入栈。否则为右括号,如果此时栈空或该括号与栈顶的括号不相等,则表示不匹配,返回false。否则为匹配,此时弹出栈顶元素,扫描下一个字符,直到字符串为空。
- 返回遍历结束后栈是否为空,栈不为空表示左括号有剩余。