题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
示例 1:输入: "()";输出: true
示例 2:输入: "()[]{}";输出: true
示例 3:输入: "(]";输出: false
示例 4:输入: "([)]";输出: false
示例 5:输入: "{[]}";输出: true
解答:
算法
初始化栈 S。
一次处理表达式的每个括号。
如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
代码
public static boolean isValid(String s) {
HashMap<Character, Character> map=new HashMap<>();
map.put(')', '(');
map.put('}', '{');
map.put(']', '[');
Stack<Character> stack=new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c=s.charAt(i);
//判断到是 右括号
if (map.containsKey(c)) {
//弹出栈顶元素
char topElement=stack.empty()?'#':stack.pop();
//栈顶元素与右括号对应的左括号是否相同
if (topElement!=map.get(c)) {
//不相同,直接return false
return false;
}
}else{
//判断到是 左括号,加入栈
stack.push(c);
}
}
//最后栈是否为空,返回结果。
return stack.isEmpty();
//不可以这样写,当没有左括号时,topElement=null,map.get(topElement)报空指针。
//c!=map.get(topElement)
}
注意:
在表示问题的递归结构时,栈数据结构可以派上用场。我们无法真正地从内到外处理这个问题,因为我们对整体结构一无所知。但是,栈可以帮助我们递归地处理这种情况,即从外部到内部。