给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
——1.左括号必须用相同类型的右括号闭合。
——2.左括号必须以正确的顺序闭合。
——3.注意空字符串可被认为是有效字符串。
题目分析
题目要求以正确的顺序闭合:(+)、[+]、{+}
——也就是只能左括号在前,右括号在后面来进行匹配,那么我们可以使用stack,将左括号压入栈,如果后面的括号与之匹配,则将它出栈,继续下一轮匹配。如果是有效的字符串,也就是每对括号都完全匹配,栈最后会为空,另外题目说空字符串也可以认为是有效的,所以最后判断栈是否为空可以知道是否为有效字符串。
——细节的一点:一开始如果没有左括号入栈,此时的栈也是空的,但是没有左括号的情况下,是不能进行匹配的,所以此时是无效的字符串
解法一:Stack
// stack
public boolean isValid(String s) {
char[] ch = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < ch.length; i++) {
if (ch[i] == '(' || ch[i] == '[' || ch[i] == '{') {
stack.add(ch[i]);
} else if (!stack.isEmpty()) {
if (stack.peek() == '(' && ch[i] == ')') {
stack.pop();
} else if (stack.peek() == '[' && ch[i] == ']') {
stack.pop();
} else if (stack.peek() == '{' && ch[i] == '}') {
stack.pop();
} else {
return false;
}
} else {
return false;
}
}
return stack.isEmpty();
}
解法二:Stack+HashMap
此处用到了HashMap,代码简洁明了:
——先将右括号添加到map中,循环体里面判断元素是否为左括号(不在map中),是左括号直接压入栈;不是左括号的情况下:要么栈为空,要么栈之前有左括号,现在进行左右括号的匹配,匹配不成功直接返回false;
——最后进行stack是否为空的判断。
// HashMap
public boolean isValidByHashMap(String s) {
char[] ch = s.toCharArray();
HashMap<Character, Character> map = new HashMap<>();
Stack<Character> stack = new Stack<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
for (int i = 0; i < ch.length; i++) {
if (!map.containsKey(ch[i])) {
stack.add(ch[i]);
} else if (stack.isEmpty() || stack.pop() != map.get(ch[i])) {
return false;
}
}
return stack.isEmpty();
}
end.