LeetCode第20题思悟——有效的括号(valid-parentheses)
知识点预告
- 数据结构类型的选择——栈;
- 数据结构实现的选择——简单高效;
- 算法和数据结构的密切关系——要实现1+1>2的效果:相辅相成,互相成就;
题目要求
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
示例 1:
输入: “()”
输出: true
示例 2:输入: “()[]{}”
输出: true
示例 3:输入: “(]”
输出: false
示例 4:输入: “([)]”
输出: false
示例 5:输入: “{[]}”
输出: true来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
该题考察数据结构——栈的使用,为什么是栈呢?因为先遇到的左括号,匹配后遇到的右括号;或者说,先遇到的右括号匹配后遇到的左括号:
public boolean isValid(String s) {
LinkedList<Character> stack=new LinkedList<>();
HashMap<Character,Character> buffer=new HashMap<>(3);
buffer.put('}','{');
buffer.put(']','[');
buffer.put(')','(');
char[] chars=s.toCharArray();
char topChar;
for(char currentChar:chars){
if(currentChar=='}'||currentChar==')'||currentChar==']'){//弹出
if(stack.peek()!=null){
topChar=stack.poll();
if(topChar!=buffer.get(currentChar)){
return false;
}
}else{
return false;
}
}else{
stack.push(currentChar);
}
}
return stack.size()==0;
}
优秀解法
//解法A
public boolean isValid(String s) {
int length = s.length();
if(length == 0){
return true;
}
if(length % 2 == 1){
return false;
}
int i = 0;
int j = 0;
char[] box = new char[length];
while(i < length){
switch(s.charAt(i)){
case ')' : if(j == 0 || box[--j] != '('){return false;}break;
case ']' : if(j == 0 || box[--j] != '['){return false;}break;
case '}' : if(j == 0 || box[--j] != '{'){return false;}break;
case '(' : box[j++] = '(';break;
case '[' : box[j++] = '[';break;
case '{' : box[j++] = '{';break;
}
i++;
}
return j == 0;
}
差异分析
解题思路是一样的,但是栈的实现却不一样;在我的解法中,我使用了系统提供数据结构;而优秀解法中则使用了数组来模拟栈;
对于解题来说,无疑后者更为优秀;因为解题并不涉及复杂的数据结构,使用系统提供的数据结构,反而显得有些杀鸡用牛刀——笨重了;
该题给我们的启示是:**算法思想很重要,选择合适的数据结构同样重要!**这一结论在后面的题解中还会出现的。
知识点小结
- 数据结构类型的选择——栈;
- 数据结构实现的选择——简单高效;
- 算法和数据结构的密切关系——要实现1+1>2的效果:相辅相成,互相成就;