引言
由 “LSGO软件技术团队” 组织的 “基础算法刻意练习” 采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。以下是我的每日打卡记录:
Task15.有效的括号
-
Leetcode第20题
-
难度:简单
-
题目概述:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串 是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: "()" 输出: true 示例 2: 输入: "()[]{}" 输出: true 示例 3: 输入: "(]" 输出: false 示例 4: 输入: "([)]" 输出: false 示例 5: 输入: "{[]}" 输出: true
题解思路
其实看到匹配括号就马上想到了“栈”的使用,遇到左括号则压入栈,遇到有括号则弹出栈且判断是否匹配。遍历之后,看栈中是否还有元素,如果还有,说明缺少了有括号,否则,匹配成功。
时间复杂度:O(n)
class Solution {
public boolean isValid(String s) {
Stack<Integer> stack=new Stack<>();
for(int i=0;i<s.length();i++){
int type=getType(s.charAt(i));
if(type>0)
stack.push(type);
else if( stack.empty() || type+stack.pop()!=0 )
return false;
}
return stack.empty()?true:false;
}
//此处用±1,±2,±3代表左右括号
public int getType(char c){
switch(c){
case '(':
return 1;
case ')':
return -1;
case '[':
return 2;
case ']':
return -2;
case '{':
return 3;
case '}':
return -3;
default:
return 0;
}
}
}