问题描述:
分析:
首先可以肯定的是当输入的字符串为null或者是字符串的长度为奇数的时候可以直接返回false。
这道题目应当用栈这种数据结构来解答,遍历输入的字符串每当遇到左边的括号就将其进栈,每当遇到右边的括号就将栈顶元素出栈。如果出栈的元素不是对应的左括号则直接返回false。最后当栈中没有括号元素时返回true。
此外,为了避免没有任何元素进栈导致的空栈报错,我们可以先push一个字符进去放在栈底,最后遍历完只剩下最开始push进去的那个字符则返true。
代码实现:
class Solution {
public boolean isValid(String s) {
//如果输入的字符串为空或者长度不为偶数直接返回false
if (s == null || s.length() % 2 !=0) return false;
Stack<Character> brackets = new Stack();
//先给栈中push一个字符,避免出现没有任何元素进栈导致的空栈报错
brackets.push('?');
for (int i = 0; i < s.length(); i++) {
char bracket = s.charAt(i);
//如果遍历到的是左括号直接进栈
if (bracket == '(' || bracket == '{' || bracket == '[')
brackets.push(bracket);
//如果遍历到的是右括号则出栈,但如果出栈的左括号不是对应的直接返回false
else if (bracket == ')' && brackets.pop() != '(')
return false;
else if (bracket == '}' && brackets.pop() != '{')
return false;
else if (bracket == ']' && brackets.pop() != '[')
return false;
}
//若最后栈顶只剩下特别设置的'?'则返回true
return brackets.peek() == '?';
}
}