给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
解题思路:
可以从左到右遍历字符串 s,可以得到最后的左括号先闭合(同类型),然后到前一个左括号闭合,符号栈的特点——后进先出。
所以遍历时可以遇到左括号就让其同类型的右括号进栈,然后遇到右括号,就看与栈顶元素是否相等就可以了。
代码实现:
// 无注释版
class Solution {
public:
bool isValid(string s) {
if(s.size()%2==1)
return false;
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('}');
else if(stk.empty()||stk.top()!=s[i])
return false;
else stk.pop();
}
return stk.empty();
}
};
// 注释版
class Solution { // 类实现
public:
bool isValid(string s) {
if(s.size()%2==1) // 直接剔除不成对的
return false; // 可以提高运行效率
stack<char>stk; // 创建栈stk
for(int i=0;i<s.size();i++) // 遍历字符串 s
{ // 遇到左括号,就把相应类型的有括号栈
if(s[i]=='(') stk.push(')');
else if(s[i]=='[') stk.push(']');
else if(s[i]=='{') stk.push('}');
// 如果栈为空或者栈顶元素不等于该右括号
// 则返回false
else if(stk.empty()||stk.top()!=s[i])
return false;
// 剩下的就只有符合了,所以栈顶元素出栈
else stk.pop();
}
// empty()函数:如果栈为空则返回1
// 若不为空则返回0
// 判断是否还有未闭合的左括号
return stk.empty();
}
};