题目
给定一个只包括 ‘(’ ,’)’,’{’ ,’}’,’[’ ,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
栈思想
下面看一下将 ( , [ , ] , ) 依次入栈,出栈的过程
如果入栈后是绿色的情况(符合题目要求)就可以出栈
JAVA实现
class Solution {
public boolean isValid(String s) {
if(s.length() <= 1 || s.length() % 2 != 0) return false;
char a = ')', b = '}', c = ']' ;
char e = '(', f = '{', g = '[' ;
Deque<Character> stack = new LinkedList<Character>();
for(int i = 0;i < s.length(); i++){
char ch = s.charAt(i);
if(stack.isEmpty() && (ch == a || ch == b || ch == c)) return false;
if(stack.isEmpty()) {
stack.push(ch);
continue;
}
if((stack.peek() == e && ch == a) || (stack.peek() == f && ch == b )|| (stack.peek() == g && ch == c)) {
stack.pop();
}else{
stack.push(ch);
}
}
if(stack.isEmpty()) return true;
return false;
}
}
- 时间复杂度: O(n) :遍历了一次数组
- 空间复杂度:O(n) : 栈 = 字符串长度