1.题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
2.思考
a)首先是用什么数据结构,这道题的解法只有一个就是用栈的方式,stack
b)如果是左括号,就直接push入栈
c)如果是右括号,则将栈pop出栈,判定是否与这个右括号匹配,若匹配则继续,若不匹配,则返回false
d)用什么数据结构进行匹配,这里用map即可
3.java代码
class Solution {
public boolean isValid(String s) {
if(s.length()==0 || s==null)
{
return true;
}
Stack<Character> stack=new Stack<>();
Map<Character,Character> map=new HashMap<>();
map.put(')','(');
map.put('}','{');
map.put(']','[');
for(Character c:s.toCharArray())
{
if(c=='{' || c== '[' || c=='('){
stack.push(c);
}
else if( stack.size() ==0 ||stack.pop() != map.get(c)) return false;
}
return stack.size() == 0;
}
}
4.易错点分析
else if( stack.size() ==0 ||stack.pop() != map.get©) return false;
这一句中,很多人忘记添加stack.size() ==0 这一个条件,可以试想如果给的输入字符串为"}}}}"全是右括号的情况,
那么在第一个右括号出现的时候,就应该判定为错误了,因为他的前面没有与他匹配的左括号。
一定记住,左括号一定在有右括号前面
5.扩展
如果让你检查 XML 标签是否闭合如何检查, 更进一步如果要你实现一个简单的 XML 的解析器,应该怎么实现?