目录
题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解法1:Stack
/**
* 思路:
* map中存放括号
* stack中存放左括号,遇到右括号就出栈
* 如果最后stack.size==0说明是有效括号
*/
public boolean isValid(String s) {
ArrayDeque<Character> stack = new ArrayDeque<>();
HashMap<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
char[] chars = s.toCharArray();
for (char c:chars){
if (map.containsValue(c))stack.push(c);
else {
if (map.get(c)==stack.peek())stack.pop();
else return false;
}
}
return stack.size()==0;
//return stack.isEmpty();
}
时间复杂度:On
空间复杂度:On
解法2:Stack(不使用Map)
/**
* 思路:
* 如果是左括号入栈,但是入栈的是右括号
* 如果是右括号,判断stack是否为null,不为null看是否和栈顶元素相同
* 最后判断栈是否为null
*/
public boolean isValid(String s) {
char[] chars = s.toCharArray();
ArrayDeque<Character> stack = new ArrayDeque<>();
for (char c : chars) {
if (c == '(') stack.push(')');
else if (c == '[') stack.push(']');
else if (c == '{') stack.push('}');
else if (stack.isEmpty() || c != stack.pop()) return false;
}
return stack.isEmpty();
}
时间复杂度:On
空间复杂度:On