给定一个只包括 '(',')','{','}','[' , ']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例1
输入: "()"
输出: true
示例2
输入: "([)]"
输出: false
解法1,利用栈的特性和题目的特殊性
class Solution {
public static boolean isValid(String s) {
//空字符串,也是有效字符串
if (s.isEmpty()) {
return true;
}
//建立一个字符型的栈
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
//这里的思路是,遇到一种类型的左闭合括号,就将其对应的右闭合括号压入栈中
if (c == '(') {
stack.push(')');
} else if (c == '{') {
stack.push('}');
} else if (c == '[') {
stack.push(']');
} else {
//没有匹配的左括号-栈为空或者弹出栈的字符和现有循环的字符不匹配
if (stack.isEmpty() || stack.pop() != c) {
return false;
}
}
}
//栈已经全部清空-返回true,有未匹配的字符-返回false
return stack.isEmpty();
}
}
解法2,利用一个hashmap作为检验
public static boolean isValid(String s) {
//空字符串,也是有效字符串
if (s.isEmpty()) {
return true;
}
//奇数个的情况,不必继续校验
if (s.length() % 2 != 0) {
return false;
}
//建立一个字符型的栈
Stack<Character> stack = new Stack<>();
//用来检验的hashmap
HashMap<Character, Character> hashMap = new HashMap<Character, Character>() {{
put('}', '{');
put(']', '[');
put(')', '(');
}};
for (char c : s.toCharArray()) {
if (stack.isEmpty()) {
stack.push(c);
} else if (hashMap.get(c) == stack.peek()) {
//遇到符合要求的右括号,弹出栈顶的元素
stack.pop();
} else {
//否则继续压入元素
stack.push(c);
}
}
return stack.isEmpty();
}