给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

    :::info 1、规律:右括号总是与最近的左括号进行匹配,因此左括号是后进先出,数据结构使用栈,栈中元素是字符串中的左括号。 ::: :::danger 2、分析:下标从小到大进行遍历,遇到左括号压栈,遇到右括号时,从栈中弹出左括号与右括号进行匹配。 ::: :::success 3、步骤:① 初始化一个栈。
    ② 循环遍历字符串s中的每一个字符:
    ③ 如果当前字符为左括号,则压栈,结束本次循环,进入下一次循环;
    ④ 如果当前字符为右括号,如果栈中没有元素,则返回false,否则,从栈中弹出左括号,与右括号进行匹配,如果不能匹配,则返回false
    ③ 跳出循环栈可能不为空,当栈不为空时,返回false;
    ④ 返回TRUE。 ::: :::info 4、代码:
    刚开始自己实现的 :::

    1. class Solution {
    2. public boolean isValid(String s) {
    3. char[] chs = s.toCharArray();
    4. LinkedList<String> stack = new LinkedList<>();
    5. for(int i=0; i<chs.length; i++){
    6. if(isLeft(chs[i])){
    7. stack.push(String.valueOf(chs[i]));
    8. continue;
    9. }
    10. if(isRight(chs[i])){
    11. if(stack.size() == 0){
    12. return false;
    13. }
    14. char left = stack.pop().charAt(0);
    15. if(!isMatch(left, chs[i])){
    16. return false;
    17. }
    18. }
    19. }
    20. if(stack.size() != 0){
    21. return false;
    22. }
    23. return true;
    24. }
    25. private boolean isLeft(char left){
    26. return "([{".indexOf(left) >= 0;
    27. }
    28. private boolean isRight(char right){
    29. return ")]}".indexOf(right) >= 0;
    30. }
    31. private boolean isMatch(char left, char right){
    32. return "([{".indexOf(left) == ")]}".indexOf(right);
    33. }
    34. }

    :::success 4、题解:
    使用HashMap存储左右括号匹配,右括号为键,左括号为值。
    ① 判断字符串的长度是否为偶数,如果不是,直接返回false;
    ② 初始化一个栈。
    ③ 循环遍历字符串s中的每一个字符:
    ④ 当前字符存在hashmap的键中,说明当前字符为右括号,若栈为空,或者栈顶元素和hashmap中的值不匹配,返回false;否则,弹出栈顶元素
    ⑤ 当前字符存在hashmap的键中,说明当前字符为左括号,压栈。
    ③ 跳出循环栈可能不为空,当栈不为空时,返回false;
    ④ 返回true。 :::

    1. class Solution {
    2. public boolean isValid(String s) {
    3. if(s.length() % 2 == 1){
    4. return false;
    5. }
    6. Map<Character, Character> map = new HashMap<>(){{put(')', '('); put(']', '['); put('}', '{');}};
    7. Deque<Character> stack = new LinkedList<>();
    8. char[] chs = s.toCharArray();
    9. for(int i=0; i<chs.length; i++){
    10. if(map.containsKey(chs[i])){
    11. if(stack.size() == 0 || stack.peek() != map.get(chs[i])){
    12. return false;
    13. }else{
    14. stack.pop();
    15. }
    16. }else{
    17. stack.push(chs[i]);
    18. }
    19. }
    20. if(stack.size() != 0){
    21. return false;
    22. }
    23. return true;
    24. }
    25. }