题目 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
代码
public class Solution {
public static boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i); //
if (pairs.containsKey(ch)) { //如果是右括号
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {//此双端队列的第一个元素 ,如果此双端队列为空,则返回 null
return false;
}
stack.pop();//和右括号匹配完成,栈内左括号出栈
} else {
stack.push(ch);//左括号入栈 待匹配
}
}
return stack.isEmpty();
}
}
解析:
建立一个Map 对 三种括号对进行映射:
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
建立一个LinkedLIst用于对数据进行栈操作:
Deque<Character> stack = new LinkedList<Character>();
for循环遍历输入的 “括号对” 字符串。
如果是左括号,先入栈:
else {
stack.push(ch);//左括号入栈 待匹配
}
如果是右括号:
stack.isEmpty() 判断如果进入该条件,说明右括号最先入栈,从而说明右括号出现在输入串的第一位;
stack.peek() != pairs.get(ch) 判断栈顶不是相对应于右括号的左括号
if (pairs.containsKey(ch)) { //如果是右括号
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
//stack.isEmpty()判断如果进入该条件,说明右括号最先入栈,从而说明右括号出现在输入串的第一位
//stack.peek() != pairs.get(ch) 判断栈顶不是相对应于右括号的左括号
//以上两条件任一成立,说明该输入的括号串不有效
stack.pop();//和右括号匹配完成,栈内左括号出栈
}
最后判断栈是否为空(若该输入有效,则栈内元素经过上述匹配会变成空)
return stack.isEmpty();