一、需求
- 给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。 -
有效字符串需满足:①左括号必须用相同类型的右括号闭合;②左括号必须以正确的顺序闭合,注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
二、辅助栈
2.1 思路分析1
2.2 代码实现1
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == '(' || c == '[' || c == '{') {
stack.addFirst(c);
} else if(c == ')') {
if(stack.size() == 0 || stack.removeFirst() != '(') return false;
} else if(c == ']') {
if(stack.size() == 0 || stack.removeFirst() != '[') return false;
} else if(c == '}') {
if(stack.size() == 0 || stack.removeFirst() != '{') return false;
}
}
if(stack.size() != 0) return false;
return true;
}
}
2.3 思路分析2
2.4 代码实现2
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == '(') {
stack.addFirst(')');
} else if(c == '[') {
stack.addFirst(']');
} else if(c == '{') {
stack.addFirst('}');
} else {
if(stack.size() == 0 || stack.removeFirst() != c) return false;
}
}
if(stack.size() != 0) return false;
return true;
}
}
2.5 复杂度分析
- 时间复杂度为O(N),其中N为字符串元素的个数;
- 空间复杂度为O(N),最坏情况下,栈存储N个元素;