给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
思路 : 遍历一下字符串s,如果是左括号( '(' , '[','{' )则入栈,如果是右括号( ')','}',']') 则判断其是否与当前栈顶元素相等,如果相等则出栈一次,否则就不匹配返回。
当字符串是奇数时自然是不匹配的;
另外当栈中没有元素时,如果当前字符串访问的字符是右括号时也不匹配。
class Solution {
public:bool isValid(string s ){
if(s.size()== 0) return false ;
if(s.size()%2 == 1) return false ;
if(s[0] &&(s[0]== ']' || s[0]== '}'||s[0] == ')' )) {
return false ;
}
int length = s.size() ;
stack<char> charst ;
char curr_deal_char; // 当前处理的字符
for(int i = 0 ;i<length ; i++) {
if(charst.size() == 0 && (s[i]== ']' || s[i]== '}'||s[i] == ')' )){
return false ;
}
// 如果遇到左括号,入栈
if(s[i] == '(' || s[i] == '{' || s[i] == '['){
charst.push(s[i]) ;
}
else if(s[i]== ']' || s[i]== '}'||s[i] == ')'){
// 如果遇到右括号
char tmp = charst.top() ;
//cout<<tmp<<endl;
if(s[i] ==']' && tmp =='[') {
// 如果相等,则抵消
charst.pop() ;
}else if(s[i] == ')' && tmp == '(') {
charst.pop() ;
}else if(s[i] == '}' && tmp == '{') {
charst.pop() ;
}else {
return false ;
}
}
}
//cout<<charst.size()<<endl;
return charst.empty();
}
};