1 题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
2 Java
2.1 方法一(map匹配)
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
StringBuilder sB = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 如果c是左半边
if(map.containsKey(c)){
sB.append(c);
}
// 若c为非左半边,且sB长度为0
else if(sB.length() == 0){
return false;
}
else {
// 若c为右半边,且能和之前第一个左半边括号匹配
if(map.get(sB.charAt(sB.length() - 1)) == c){
sB.deleteCharAt(sB.length() - 1);
}else{ // 若c为右半边,但不能和之前的第一个左半边括号匹配
return false;
}
}
}
// 若左右半边括号已全部匹配完毕,没有剩余
return sB.length() == 0 ? true : false;
}
}
2.2 方法二(方法1的化简)
后进先出用stack
map.put(’?’, ‘?’); 能避免判断 stack 内元素数是否为 0
class Solution {
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
// !!!化简
map.put('?', '?');
Stack<Character> stack = new Stack<>();
// !!!化简
stack.push('?');
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 如果c是左半边
if(map.containsKey(c)){
stack.push(c);
}
// 若c为右半边,但不能和之前的第一个左半边括号匹配
else if(map.get(stack.pop()) != c){
return false;
}
}
// 若左右半边括号已全部匹配完毕,没有剩余(只剩一个?)
return stack.size() == 1;
}
}