给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
第一种:
public boolean isValid(String s) {//创建了一个Stack<Character> 类型的栈对象Stack<Character> stack = new Stack<>();//字符串s转换成字符数组char[] chars = s.toCharArray();//遍历历字符数组中的每一个字符 for(char ch:chars){//判断当前字符是否为'(',如果是,则将对应的闭合括号')'入栈if(ch=='('){stack.push(')');//判断当前字符是否为'{',如果是,则将对应的闭合括号'}'入栈}else if(ch=='{'){stack.push('}');//判断当前字符是否为'[',如果是,则将对应的闭合括号']'入栈}else if(ch=='['){stack.push(']');//判断栈是否为空或者当前字符与栈顶元素不匹配,如果满足任一条件,则说明括号不匹配,直接返回false}else if(stack.isEmpty()||ch!=stack.pop()){return false;}}//遍历后,判断栈是否为空,如果为空,则说明所有括号都匹配,返回true,否则返回falsereturn stack.isEmpty();}
第二种:
public boolean isValid(String s) {// 定义Map对象Map<Character, Character> map = new HashMap<>();map.put('(', ')');map.put('{', '}');map.put('[', ']');// 1. 声明一个栈出来,用来存储左扩号,左括号入栈,右括号出栈Stack<Character> stack = new Stack<>();// 2. 遍历字符串中的每一个字符for (int i = 0; i < s.length(); i++) {// 得到当前的字符Character c = s.charAt(i);// 如果当前的字符在map中,则进行入栈if (map.containsKey(c)) {// 入栈操作stack.push(c);}//如果当前栈不为空 且 字符不再map中,且该字符等于栈顶元素的map中的值(就是左右括号匹对),出栈else if (!stack.empty() && map.getOrDefault(stack.pop(), ' ').equals(c)) {// 已经进行出栈了continue;}else {// 什么都不满足 直接返回不匹配return false;}}//遍历后,判断栈是否为空,如果为空,则说明所有括号都匹配,返回true,否则返回falsereturn stack.isEmpty();}