问题描述
给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
输入描述:
输入一个括号的字符串
输出描述:
输出这个括号是否合法
示例
示例1
输入
“[]”
输出
true
解决思路
分析
- 借助栈数据结构,可以碰到左括号如栈,右括号出栈
方法
- 借助栈数据结构,可以碰到左括号如栈,右括号出栈。
(PS小技巧:可以碰到左括号,入栈右括号,可以节省空间)
代码实现
// 思路1
public class Solution {
public boolean isValid (String s) {
if (s == null || s.length() == 0 || "".equals(s)) {
return true;
}
// write code here
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
stack.add(s.charAt(i));
continue;
}
if (stack.isEmpty()) return false;
if (s.charAt(i) == ')' && stack.pop() == '(') {
continue;
} else if (s.charAt(i) == ']' && stack.pop() == '[') {
continue;
} else if (s.charAt(i) == '}' && stack.pop() == '{') {
continue;
} else {
return false;
}
}
return stack.isEmpty();
}
// 小技巧
public boolean isValid2(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '[')
stack.push(']');
else if (c == '{')
stack.push('}');
else if (stack.empty() || stack.pop() != c)
return false;
}
return stack.empty();
}
}
时间复杂度分析:
O(N) :遍历字符串次数为N,所以时间复杂度为O(N)
空间复杂度分析:
O(N):假设字符串全部都是左括号,则需要全部入栈,所以空间复杂度为O(N)
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试