给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
栈解法
首先,先判断是否s[i]所指向的字符(,[,{这三种,假如这三种,压入栈中,假如并不是这三种,从栈中弹出一个字符与其进行匹配,假如说测试用例是类似这样[ ) ],没有左边的匹配符,栈为空,则为空指针异常,所以指针没有指向最后且栈为空的时候,就直接返回false。
对于这道题,我一开始用的就是栈解法,但是后面我麻了一下,写了个双指针,【()[]{}】示例直接把双指针的解法给破了,所以还是中规中矩用栈解法。
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
if (s.length() == 0) {
return true;
}
for (int i = 0; i < s.length(); i++) {
char curChar = s.charAt(i);
//假如是 ( { [ 其中一項,就将其压入栈中
if (curChar == '(' || curChar == '{' || curChar == '[') {
stack.push(curChar);
} else {
if(stack.empty()){
return false;
}
//否则就弹出栈
char match = stack.pop();
if (match == '{' && curChar != '}' || match == '[' && curChar != ']' || match == '(' && curChar != ')') {
//不匹配就返回false
return false;
}
}
}
//判断栈是否为空
return stack.empty();
}
LeetCode 102 层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
层序遍历就是利用队列,到达一个子节点的时候,检查是否有左右子节点,假如有左右子节点,扔进队列中。
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
//假如根节点判空,新建列表
if (root == null) {
return new ArrayList<>();
}
//创建个队列
Queue<TreeNode> queue = new ArrayDeque<>();
//将根节点扔进队列中
queue.add(root);
while (!queue.isEmpty()) {
// 获取层级节点的个数
int n = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
//取出当前层级
TreeNode treeNode = queue.poll();
assert treeNode != null;
//将当前层级加入列表中
list.add(treeNode.val);
if (treeNode.left != null) {
//队列新增该节点的右节点
queue.add(treeNode.left);
}
if (treeNode.right != null) {
//队列该节点的右节点
queue.add(treeNode.right);
}
}
res.add(list);
}
return res;
}