20. 有效的括号
其实题目很简单,就是一个栈的匹配问题,也不能玩出什么花来,但让我注意的是有之前[12、整数转罗马数字一样],存在少量重复结构,对于题目而言,我们只写leetcode,求速度和过,是可以直接重复写,但是我这一遍重新写代码,是想养成一个好的代码书写习惯,不是只求过。
所以我更倾向于写可扩展性强,而不是大量if else的代码。
下面是两种代码:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '}') {
if (stack.empty() || stack.pop() != '{') return false;
} else if (s.charAt(i) == ')') {
if (stack.empty() || stack.pop() != '(') return false;
} else if (s.charAt(i) == ']') {
if (stack.empty() || stack.pop() != '[') return false;
} else stack.push(s.charAt(i));
}
return stack.empty();
}
另一种,实际上int[]可以换成hashmap的,显得更方便
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
int[] map = new int[128];
map['}'] = '{';
map[']'] = '[';
map[')'] = '(';
for (int i = 0; i < s.length(); i++) {
if (map[s.charAt(i)] > 0) {
if (stack.empty() || map[s.charAt(i)] != (int)stack.pop()) return false;
} else stack.push(s.charAt(i));
}
return stack.empty();
}