好长时间都不更新leetcode题解了,博主今天忙里偷闲来解一下这个有关于栈知识的题目。
20.有效的括号:OJ链接
先看题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1: 输入:s = “
()
” 输出:true
示例 2:输入:s = “()[]{}
” 输出:true
示例 3: 输入:s = “(]
” 输出:false
示例 4:输入:s = “([)]
” 输出:false
示例 5: 输入:s = “{[]}
” 输出:true
解题想法:
- 第一步老样子判断传来的字符串是否为空,如果为空就返回null,判断传来的字符串是否为0,在题目中明确表明当字符串长度为0时,返回true;
- 第二步:这下就到重点了,有效括号,括号有左括号和右括号,并且要想办法看他们是否匹配。这里有一种方法利用栈的特性先进后出,我们从字符串的左边遍历,把左括号压到栈中,然后在遍历下一个字符,如果下一个字符是右括号,那么就看看栈中的括号和我们遍历到的这个字符是否匹配(注意括号类型),如果匹配就把栈中的字符弹出,然后在遍历下一个字符串,重复循环,直到把字符串遍历完成。
- 我们在遍历字符串的过程中,可能会遇到左括号多,右括号少的情况,比如说
(((())
,那就是在两次匹配之后,我们把栈中的两个左括号都弹出,现在还有两个左括号,就直接判断栈是否为空,如果为不为空就返回false. - 在我们遍左括号的过程中还会遇到,左括号少,右括号多的情况。 比如
(())))
还是一样的在我们两次匹配之后,右括号还剩余一个,所以我们现在要检查栈中是否还有左括号,如果没有就返回false.
案例一:当字符串为"{[()]}"
动图演示:
案例二:当字符串为"(){}[]"
动图演示:
案例三:当字符串为"(())))"
动图演示:
案例四:"(((())"
动图演示:
代码演示:
public static boolean isValid(String s) {
//先看传来的字符串是不是为空
if(s.length() == 0){
return true;
}
if(s == null){
return false;
}
//创建一个栈,用来保存字符串中的左括号
Stack<Character>stack = new Stack<>();
for(int i = 0;i<s.length();i++){
char ch = s.charAt(i);//获取每一个字符
if(ch == '{' || ch == '[' || ch == '('){
stack.push(ch);
}else if(stack.empty()){//右括号多
return false;
} else{
char temp = stack.peek();
if(temp == '{' && ch == '}' || temp == '[' && ch == ']' || temp == '(' && ch == ')'){
stack.pop(); //如果匹配上了,那么就把这个原来在栈上的左括号弹出,查看下一个左括号和右括号是否匹配
}else{
return false;//左括号和右括号不匹配
}
}
//如果在匹配完之后,有右括号剩余
}
if(!stack.empty()){ //如果在匹配完之后栈中还没有为空,那么证明左括号多了
return false;
}
return true;
}