题目
题目来源leetcode
leetcode地址:20. 有效的括号,难度:简单。
题目描述(摘自leetcode):
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:s = "([)]" 输出:false 示例 5: 输入:s = "{[]}" 输出:true 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成
本地调试代码:
class Solution { public int search(int[] nums, int target) { .... } public static void main(String[] args) { Solution solution = new Solution(); int[] arr = new int[]{-1,0,3,5,9,12};//这里修改数组内容 System.out.println(solution.search(arr, 2));//数组、目标值 } }
题解
NO1:栈解决
思路:若是左闭合符号就压入配对的右闭合符号,方便之后进行匹配。
示例:"()[{}]" stack=[] ① 字符'(',压入')' stack=['('] ② 字符')',与当前栈顶存放匹配,出栈 stack=[] ③ 字符'[',压入']' stack=[']'] ④ 字符'{',压入'}' stack=[']','}'] ⑤ 字符'}',与当前栈顶存放匹配,出栈 stack=[']'] ⑥ 字符']',与当前栈顶存放匹配,出栈 stack=[] 所有字符都遍历一遍之后,判断栈中是否存在元素,为空表示有效括号;不为空表示无效括号。
代码:
public boolean isValid(String s) { Deque<Character> stack = new LinkedList<>(); for (char c : s.toCharArray()) { //前面三个判断当匹配到左闭合时存储右闭合符号到栈,之后用来进行直接匹配 if(c == '('){ stack.push(')'); }else if(c == '{'){ stack.push('}'); }else if(c == '['){ stack.push(']'); }else if(stack.isEmpty() || stack.peek() != c){ //若是栈为空或者对应匹配的不一致,直接判定不匹配 return false; }else { stack.pop(); } } //若是为空,表示全部匹配完了,若是没有空说明另外少了右闭合括括号 return stack.isEmpty(); }