给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
有效的括号满足以下几个条件:
(){[]}
,其中 ()
是有效的括号,剩余的 {[]}
也是有效的括号。具体操作步骤如下:
1、 遍历包含括号字符串数组中的所有元素
2、在遍历过程中,如果字符为左括号 ( ,那么就在栈中添加对左括号 (
3、在遍历过程中,如果字符为左括号 [ ,那么就在栈中添加对左括号 [
4、在遍历过程中,如果字符为左括号 { ,那么就在栈中添加对左括号 {
5、如果不是上述的 2、3、4,说明此时的字符是 )] } 这三种符号中的一种
6、如果这个时候栈已经为空,而现在遍历的字符是 )] } 这三种符号中的一种,说明找不到可以匹配的括号,可以直接返回 false
7、如果这个时候栈不为空,那么先获取栈顶元素,将栈顶元素和此时的访问的字符进行比较
8、如果相同,则将栈顶元素移除,继续执行 1
9、如果不相同,说明不匹配,返回 false
10、遍历完整个字符数组,判断栈是否为空,如果栈为空,说明字符数组中的所有括号都是闭合的,返回 true,如果栈不为空,说明有未闭合的括号,返回 false
// LeetCode 100 题精讲:https://mp.weixin.qq.com/s/yznC53g46phq3qF7V4-obA
// 作者:程序员吴师兄
// 有效的括号( LeetCode 20 ):https://leetcode-cn.com/problems/valid-parentheses
class Solution {
public boolean isValid(String s) {
// 当字符串长度为奇数的时候,属于无效情况,直接返回 false
if (s.length() % 2 == 1) {
// 无效情况,返回 false
return false;
}
//构建一个栈,用来存储括号
Stack<Character> stack = new Stack<Character>();
// 把字符串转换为数组的形式,方便获取字符串中的每个字符
char charArray[] = s.toCharArray();
// 遍历字符串数组中的所有元素
for( int i = 0 ; i < charArray.length ; i++){
// 获取此时的字符
char c = charArray[i];
// 如果字符为左括号 ( ,那么就在栈中添加对左括号 (
if(c == '('){
// 添加对左括号 (
stack.push('(');
// 如果字符为左括号 [ ,那么就在栈中添加对左括号 [
}else if(c == '['){
// 添加对应的右括号 ]
stack.push('[');
// 如果字符为左括号 { ,那么就在栈中添加对左括号 {
}else if( c == '{'){
// 添加对应的右括号 }
stack.push('{');
// 否则的话,说明此时 c 是 )] } 这三种符号中的一种
}else {
// 如果栈已经为空,而现在遍历的字符 c 是 )] } 这三种符号中的一种
// 找不到可以匹配的括号,返回 false
// 比如这种情况 }{,直接从右括号开始,此时栈为空
if(stack.isEmpty()) return false;
// 如果栈不为空,获取栈顶元素
char top = stack.peek();
// 将栈顶元素和此时的元素 c 进行比较,如果相同,则将栈顶元素移除
if( top == '(' && c == ')' || top == '[' && c == ']' || top == '{' && c == '}' ){
// 移除栈顶元素
stack.pop();
}else{
// 如果不相同,说明不匹配,返回 false
return false;
}
}
}
// 遍历完整个字符数组,判断栈是否为空
// 如果栈为空,说明字符数组中的所有括号都是闭合的
// 如果栈不为空,说明有未闭合的括号
return stack.isEmpty();
}
}