给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
class Solution {
public:
bool isValid(string s) {
char* base;
char* top;
int stacksize=0;
stacksize=s.size();
base = new char[stacksize+1];
int cnt_1=0,cnt_2=0;
top=base;
char e;
int k=0;
if(stacksize%2!=0) return false;
if(stacksize==0) return true;
for(auto &r:s){
if(r=='('||r=='{'||r=='['){
cnt_1++;
*top++=r;
}
else{
if(r==')'||r==']'||r=='}'){
cnt_2++;
k=1;
if(base==top){
return false;
}
else{
e=*--top;
if(r==')'&&e!='(') return false;
if(r==']'&&e!='[') return false;
if(r=='}'&&e!='{') return false;
}
}
}
}
if(!k||(cnt_1!=cnt_2)) return false;
return true;
}
};
遇到左边符号直接压入,遇到右边符号将栈顶出栈进行比较,不配对直接false;
k表示判断s中是否只有左边符号,if(base==top)判断是否只有右边符号;
特殊情况拿出来单独说明。
经过几次调试,在几个测试上修改了下代码。
//貌似看到leetcode编译器里可以直接用 stack<type>name 来定义一个栈