有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]'的字符串s,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
典型的使用栈来解决的题目,真的也没什么可说的,用方式一做了一下,但是不够巧妙.
所以又在题解里找到了更好的方式,同样是利用栈,但是方法更高效.具体的思路是:
- 如果遇到’(’,’[’,’{'就入栈,否则的话:(说明当前的符号是一个右括号)
- >如果此时栈为空(但是当前还没遍历完,这就说明有一个右括号要进到栈底去),直接返回false
- >如果当前是’)‘但是出栈的这个字符不是’(’,那也可以直接返回false了
- >如果当前是’]‘但是出栈的这个字符不是’[’,那也可以直接返回false了
- >如果当前是’}‘但是出栈的这个字符不是’{’,那也可以直接返回false了
- 最终返回栈是否为空即可
一个变形的题:左括号必须以正确的顺序闭合,这个条件去掉如何实现?
这个就更简单了,说明不用完全按照(){}[]这样的规则闭合,那直接统计数量然后做加减操作,最后判断是否计数为0即可
public class Solution018 {
public static void main(String[] args) {
String s = "()[]{}";
System.out.println(isValid2(s));
}
//方法一 同样是利用栈 但是不够高效
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for(int i=0;i<s.length();i++){
if(stack.isEmpty()){
stack.push(s.charAt(i));
}else{
if(s.charAt(i)==')' && stack.peek()=='('){
stack.pop();
}else if(s.charAt(i)==']' && stack.peek()=='['){
stack.pop();
}else if(s.charAt(i)=='}' && stack.peek()=='{'){
stack.pop();
}else{
stack.push(s.charAt(i));
}
}
}
return stack.isEmpty();
}
//方法二
public static boolean isValid2(String s) {
Stack<Character> stack = new Stack<>();
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(c=='(' || c=='[' || c=='{'){//如果遇到'(','[','{'就入栈
stack.push(c);
}else if(stack.isEmpty() || c==')'&&stack.pop()!='(' || c==']'&&stack.pop()!='[' || c=='}'&&stack.pop()!='{'){
return false;
}
}
return stack.isEmpty();
}
//左括号必须以正确的顺序闭合,这个条件去掉的实现方式
public static boolean isValid3(String s){
int n1 = 0,n2 = 0,n3 = 0;
for (int i=0;i<s.length();i++){
char ch = s.charAt(i);
if (ch=='(') n1++;
else if (ch=='[') n2++;
else if (ch=='{') n3++;
else if (ch==')') n1--;
else if (ch==']') n2--;
else n3--;
}
return !(n1!=0 || n2!=0 || n3!=0);//这要有一个不为0 就是false
}
}