Leetcode刷題Java20. 有效的括號

給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。

有效字符串需滿足:

左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。

示例 1:

輸入: "()[]{}"
輸出: true


示例 2:

輸入: "([)]"
輸出: false


示例 3:

輸入: "{[]}"
輸出: true

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

class Solution {
        public boolean isValid(String s) {
            //最近相關性---》棧
            //生活中洋蔥,從中心向外,打開時從外向內;從外向內或從內向外,最外層和最外層是一對,最內層和最內層是一對
            //先來後到,隊列
            if (s.length() == 0) return true;
//            return isValidI(s);
//            return isValidII(s);
            return isValidIII(s);
        }

        //方法三:使用棧
        //如果是左括號,則將右括號壓棧
        //判斷元素是否與棧頂元素匹配,匹配不成功或棧爲空,則不合法
        private boolean isValidIII(String s) {
            Stack<Character> stack = new Stack<>();
            for (char c : s.toCharArray()) {
                if (c == '(') stack.push(')');
                else if (c == '[') stack.push(']');
                else if (c == '{') stack.push('}');
                else if (stack.isEmpty() || c != stack.pop()) return false;
            }
            return stack.isEmpty();
        }

        //方法二:棧
        //如果是左括號,壓棧,如果是右括號,就和棧頂元素進行匹配
        //匹配成功,棧頂元素移除棧,否則不合法,直到棧爲空
        private boolean isValidII(String s) {
            Stack<Character> stack = new Stack<>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c == '(' || c == '[' || c == '}') {
                    stack.push(c);
                } else if (stack.isEmpty()) return false;
                else if (c == ')' && stack.pop() != '(') return false;
                else if (c == ']' && stack.pop() != ']') return false;
                else if (c == '}' && stack.pop() != '}') return false;
            }
            return stack.isEmpty();
        }

        //方法一:暴力求解,時間複雜度O(n^2)
        //不斷replace匹配的括號
        //找到左右匹配的括號,替換成空字符串,直到整個String被換成一個空string
        //()[]{}直接替換
        //((({[]})))-->((({})))-->((()))-->(())-->()-->空
        private boolean isValidI(String s) {
            char[] c = s.toCharArray();
            //長度爲奇數,肯定不是
            if (c.length % 2 != 0) return false;
            //不斷的replace匹配的括號爲空字符串
            for (int i = 0; i < c.length / 2; i++) {
                s = s.replaceAll("\\(\\)", "")
                        .replaceAll("\\[\\]", "")
                        .replaceAll("\\{\\}", "");
            }
            return s.isEmpty();
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章