一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
需要注意的是: "" 也算是有效的括号。
通过例子我们可以得知,当遇到 右括号时,就会停止遍历,去找有没有对应的左括号。所以很适合用栈的结构,先进后出。
二、思路分析
遍历整个字符串,当遇到左括号时,就进行压栈操作。【'(' '[' '{'】。当遇到右括号时,首先判断栈是否为空,为空直接返回false,不为空进行弹栈操作,判断是否对应上,对应上,继续判断,对应不上返回 false 。
c = ' ( ' 压栈,移动指针
c = ' [ ' 压栈,移动指针
c = ' ] ' ,栈不为空。
弹栈:temp = ' [ ' 能对应上,继续移动指针判断。
c = ' ) ' ,栈不为空。
弹栈:temp = ' ( ' 能对应上,继续移动指针判断
c = ' { ' 压栈
c = ' } ' ,栈不为空。
弹栈:temp = ' { ' 能对应上,继续移动指针判断
c = ' } ' , 这时栈已经空,已经没有和他对应的了。直接返回false、
三、代码
public static boolean isValid(String s) {
// 字符串长度 是奇数,肯定有一个不匹配,直接返回 false。
if (s.length() % 2 == 1) {
return false;
}
if (s.length() == 0) {
return true;
}
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()) {
return false;
} else {
char temp = stack.pop();
if (c == '}') {
if (temp != '{')
return false;
} else if (c == ']') {
if (temp != '[')
return false;
} else if (c == ')') {
if (temp != '(')
return false;
}
}
}
}
return stack.isEmpty();
}