给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
:::info
1、规律:右括号总是与最近的左括号进行匹配,因此左括号是后进先出,数据结构使用栈,栈中元素是字符串中的左括号。
:::
:::danger
2、分析:下标从小到大进行遍历,遇到左括号压栈,遇到右括号时,从栈中弹出左括号与右括号进行匹配。
:::
:::success
3、步骤:① 初始化一个栈。
② 循环遍历字符串s中的每一个字符:
③ 如果当前字符为左括号,则压栈,结束本次循环,进入下一次循环;
④ 如果当前字符为右括号,如果栈中没有元素,则返回false,否则,从栈中弹出左括号,与右括号进行匹配,如果不能匹配,则返回false
③ 跳出循环栈可能不为空,当栈不为空时,返回false;
④ 返回TRUE。
:::
:::info
4、代码:
刚开始自己实现的
:::
class Solution {public boolean isValid(String s) {char[] chs = s.toCharArray();LinkedList<String> stack = new LinkedList<>();for(int i=0; i<chs.length; i++){if(isLeft(chs[i])){stack.push(String.valueOf(chs[i]));continue;}if(isRight(chs[i])){if(stack.size() == 0){return false;}char left = stack.pop().charAt(0);if(!isMatch(left, chs[i])){return false;}}}if(stack.size() != 0){return false;}return true;}private boolean isLeft(char left){return "([{".indexOf(left) >= 0;}private boolean isRight(char right){return ")]}".indexOf(right) >= 0;}private boolean isMatch(char left, char right){return "([{".indexOf(left) == ")]}".indexOf(right);}}
:::success
4、题解:
使用HashMap存储左右括号匹配,右括号为键,左括号为值。
① 判断字符串的长度是否为偶数,如果不是,直接返回false;
② 初始化一个栈。
③ 循环遍历字符串s中的每一个字符:
④ 当前字符存在hashmap的键中,说明当前字符为右括号,若栈为空,或者栈顶元素和hashmap中的值不匹配,返回false;否则,弹出栈顶元素
⑤ 当前字符存在hashmap的键中,说明当前字符为左括号,压栈。
③ 跳出循环栈可能不为空,当栈不为空时,返回false;
④ 返回true。
:::
class Solution {public boolean isValid(String s) {if(s.length() % 2 == 1){return false;}Map<Character, Character> map = new HashMap<>(){{put(')', '('); put(']', '['); put('}', '{');}};Deque<Character> stack = new LinkedList<>();char[] chs = s.toCharArray();for(int i=0; i<chs.length; i++){if(map.containsKey(chs[i])){if(stack.size() == 0 || stack.peek() != map.get(chs[i])){return false;}else{stack.pop();}}else{stack.push(chs[i]);}}if(stack.size() != 0){return false;}return true;}}
