一、题目描述:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
二、示例与提示:
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
- 1 <= s.length <= 104
- s 仅由括号 ‘()[]{}’ 组成
三、思路
1.左多:字符串遍历完,栈有剩余
2.左右不匹配:字符串与栈中元素不匹配
3.右多:字符串没遍历完,栈为空
四、代码
class Solution {
public:
bool isValid(string s) {
stack<char>st;
if (s.size() % 2 == 1) // 若字符串内元素个数为奇数则一定有剩余符号
return false;
for (int i = 0; i < s.size(); i++)
{
// 当分别遇到三种类型左括号时,将其所对应右括号入栈(便于判断)
if (s[i] == '(')
st.push(')');
else if (s[i] == '{')
st.push('}');
else if (s[i] == '[')
st.push(']');
// 1.若字符串未遍历完,栈已空,则右符号有剩余
// 2.若栈顶元素与字符串当前元素不匹配,则匹配失败
else if (st.empty() || st.top() != s[i])
return false;
// 匹配成功,弹出栈顶元素
else
st.pop();
}
// 3.若栈不为空,则左符号有剩余
return st.empty();
}
};
复杂度分析
时间复杂度:O(n),其中 n 是字符串 s 的长度。