题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
一、解题思路
这个题我扣了一下午,深刻反思了一下自己:就是做题少没有考虑到特殊情况或者是不会去考虑各种情况,写的我都想退学,尝试各种各样的方法,搜大家的csdn解题思路,害
错误了很多遍,是真的想哭(因为实在不会想,不是故意的错这么多遍,因为是他给我的实例都能通过,特殊的过不了)不过最后解决了,好了,重点来了:
有两个思路,第一个是:比如字符串给了我一个’(‘,结合栈堆思想,我们把左括号的可以压入栈,等到右括号出来再匹配弹出。
需要注意的是:必须对称!就是说({})可以通过但是这种({)}你要给他卡出来,说到底还是堆栈的使用
第二个是:当字符串给我们一个’(‘时我们输入’)‘,到时候直接看后边的右括号是否等于你输入的就行,我只写了这个代码
二、代码
代码如下(示例):
char pairs(char a) {
if (a == '{') return '}';
if (a == '[') return ']';
if (a == '(') return ')';
return 0;
}//前边这个函数就是为了直接入栈右括号,下边好匹配
bool isValid(char * s){
int stk[strlen(s)+1];
int top=1;
if(strlen(s)%2==1){//字符串不是偶数肯定不匹配
return false;
}
else{
for(int i=0;i<strlen(s);i++){
if(s[i]=='('||s[i]=='['||s[i]=='{'){
stk[top]=pairs(s[i]);
top++;
}
else{
if(s[i]!=stk[top-1]||top<0){//top-1是因为前边if语句块里边会多加一个1
return false;
}
top--;//相当于出栈
}
}
}
if(top==1)return true;
else return false;
}
另外:我在写这个最大的问题就是top初值需要设置为1,不能为0或者-1,这个情况考虑的是右括号多于左括号的情况。
如果你初值设为0时,当你可以匹配的已经匹配完时右括号还多一个,左括号已经没有可以出的元素了,并且此时为了匹配右括号,会到-1也就是会报错