题目描述
这是leetcode上的题。
原题链接
Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: “()”
Output: true
Example 2:
Input: “()[]{}”
Output: true
Example 3:
Input: “(]”
Output: false
Example 4:
Input: “([)]”
Output: false
Example 5:
Input: “{[]}”
Output: true
算法分析
匹配括号是一个老问题了。基本上是用栈来实现。
java语言下可以使用自带的栈类。
创建对象
首先,我创建了两个栈,一个栈为括号栈bracketStack,用来存放题目所给的括号串。然后,我创建了另一个栈,后栈postStack,用来存放暂时未匹配的括号。
压栈操作
在给bracketStack压栈时,先判断括号串是否为空和是否为奇数。当括号串为空时,直接返回true,当括号串为奇数时,由于其必定不匹配,所以返回false然后,在压栈的时候我将’{’ ‘[’ ‘(’ ‘)’ ‘]’ '}'分别用1,2,3,4,5,6来表示。
弹栈操作
压栈结束后,该进行弹栈。
在遍历bracketStack时,每次循环首先判断postStack是否为空。若为空,则bracketStack所弹出的括号必须为右括号,否者return false。然后,将弹出的括号压栈入postStack。
若postStack不为空,则首先获取bracketStack和postStack的栈顶,分别存入元素a和b中。然后,判断a和b是否匹配。在我的括号表示形式下,若a+b=7则表示a与b相匹配。
若a与b匹配,则两个栈都执行弹栈。若两元素不匹配,则看a是否为右括号。若a为右括号,则将a压栈入postStack。若a是左括号,又因为它不与b匹配,则return false。
将bracketStack遍历完后,看postStack是否为空。若postStack为空,则可以认为题目所给的括号串匹配,否者不匹配。
java代码实现
class Solution {
public boolean isValid(String s) {
Stack<Integer> bracketStack = new Stack<>();
Stack<Integer> postStack = new Stack<>();
int lengthen = s.length();
if (lengthen == 0) {
return true;
} else if ((lengthen&1)==1) {
return false;
} else {
for (int i = 0; i < lengthen; i++) {
switch (s.charAt(i)) {
case '{':
bracketStack.push(1);
break;
case '[':
bracketStack.push(2);
break;
case '(':
bracketStack.push(3);
break;
case ')':
bracketStack.push(4);
break;
case ']':
bracketStack.push(5);
break;
case '}':
bracketStack.push(6);
break;
default:
break;
}
}
}
int a, b;
for (int i = 0; i < lengthen; i++) {
if (postStack.isEmpty()) {
b = bracketStack.pop();
if (b < 4) {
return false;
} else {
postStack.push(b);
continue;
}
} else {
a = postStack.peek();
b = bracketStack.peek();
if (7 == (a + b)) {
postStack.pop();
bracketStack.pop();
} else {
if (b > 3) {
postStack.push(b);
bracketStack.pop();
continue;
} else {
return false;
}
}
}
}
if (postStack.isEmpty()) {
return true;
}else {
return false;
}
}
}
最后的最后,看完后不烦点个赞。
若各位大佬们有对本算法有一些建议也还望在评论中说出。