给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:输入:s = "()[]{}"
输出:true
示例 3:输入:s = "(]"
输出:false
示例 4:输入:s = "([)]"
输出:false
示例 5:输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
这道题我跟题解区想的一样,哈哈哈。
一个左括号要用对应的右括号来进行抵消,而且最先抵消的左括号是已经出现的最后的一个左括号,这么一想那不就是用栈就行了。创建一个栈来存储出现的左括号。如果出现右括号的话,如果栈空就直接return false;如果栈不空的话就从栈pop一个左括号,如果这连个括号刚好是一对,那就继续向后遍历字符串,然后就重复上述操作。我是给每一个符号设置了一个数字值,对应成对的括号的数字值和为零,然后然后栈中储存的也是字符的数字值。
代码如下:
public static boolean isValid(String s) {
//创建栈
char ch[]=s.toCharArray();
int sum1=0,sum2=0,sum3=0;
int i=0;
Stack<Integer> integers = new Stack<>();
while(i<ch.length){
if(getNum(ch[i])>0){
integers.add(getNum(ch[i]));
}
else{
//如果栈空直接返回false
if(integers.empty())
return false;
//如果栈不空判断是否可以成对
if(integers.pop()+getNum(ch[i])!=0)
return false;
}
i++;
}
if(integers.empty())
return true;
return false;
}
//获取数字值
public static int getNum(char ch){
if(ch=='[')
return 1;
if(ch=='(')
return 2;
if(ch=='{')
return 3;
if(ch==']')
return -1;
if(ch==')')
return -2;
return -3;
}
另外一个小知识,假如一个字符串只有“["和"]”组成,然后判断该字符串是否有效。
代码如下:
public boolean valid(char arr[]){
int sum=0;
int pos=0;
while(pos<arr.length){
if(arr[pos]=='('){
sum++;
}else{
sum--;
}
if(sum<0){
return false;
}
pos++;
}
if(sum>0){
return false;
}
return true;
}