给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:输入: "()"输出: true
示例 2:输入: "()[]{}"输出: true
示例 3:输入: "(]"输出: false
示例 4:输入: "([)]"输出: false
示例 5:输入: "{[]}"输出: true
首先根据题意我们得到算法的输入是:一个字符串
输出是一个布尔型的变量判断是否为有效的括号
首先理解下有效的括号:什么叫做有效?
最初那么应该成对出现,这也就得到字符串的长度应该是偶数,要是奇数的话直接输出false。但是有个特例情况那就是字符串长度为0时,也是一个有效的字符串,这是个套路。Uman
OK,以上情况都满足的条件下我们怎么操作呢????
首先我们要考虑我们用什么数据结构呢?
用栈!!!
为何用栈这是因为最右边的左括号接下来下一个一定要是自己那一类右括号相匹配,这也就是后进先出,那么用栈最合适。
什么是最右边的左括号一定要和自己那一类右括号相匹配?
例如说(([{}]))中,首先,指针指向了最右边的左括号是{,其前面的都已经保存在栈内,那么接下来必须是自己的右边也就是}
然后继续往右移动指针
直到匹配完成
假如说有不匹配的怎么办?????
直接跳出循环。
最后判断是否是栈为空且遍历完字符串就OK了
接下来solo时间::::
class Solution {
public boolean isValid(String s) {
int len=s.length();
if(len==0){
return true;
}
else if(len%2!=0){
return false;
}
else{
char[] stack=new char[len];//用数组实现栈
int j=0;
for(int i=0;i<len;i++){
int j1=j;//这个j1就是判断是否做了操作
char temp=s.charAt(i);
if(temp=='('||temp=='['||temp=='{'){
stack[j]=temp;//若是左括号则压栈
j++;
}
else{ //当栈非空,
//且满足栈顶元素是temp对应的左括号时,出战,且栈顶指针下移
if(j>0&&temp==')'&&stack[j-1]=='('){
stack[j-1]=' ';
j--;
}
if(j>0&&temp==']'&&stack[j-1]=='['){
stack[j-1]=' ';
j--;
}
if(j>0&&temp=='}'&&stack[j-1]=='{'){
stack[j-1]=' ';
j--;
}
}
if(j1==j)//若是没做操作也就是说明,出现了不匹配
//也就是说可以跳出循环了
break;
}
if(j==0&&stack[j]==' '){
return true;//终止条件
}
else
return false;
}
}
}
最后宣传下我个人的微信公众号,微信搜索:可及的小屋,有志向整副业,娱乐的程序员们,欢迎您的到来。谢谢。
100G程序员资料,自取哦!!