演算法練習題1-括號序列

我還年輕呀!發表於2020-11-13

題目

給出一個僅包含字元’(’,’)’,’{’,’}’,’[‘和’]’,的字串,判斷給出的字串是否是合法的括號序列
括號必須以正確的順序關閉,"()“和”()[]{}“都是合法的括號序列,但”(]“和”([)]"不合法。

public class Solution {
    /**
     *
     * @param s string字串
     * @return bool布林型
     */
    public boolean isValid (String s) {
        /**
         * 1、將所有字元儲存
         * 2、遍歷所有字元,利用棧和編譯原理符號棧的原理
         *      (1)依次遍歷
         *      (2)如果遇到“)}]”中的符號,就和上一個比較,因為只有成對出現,切沒有交叉才為true
         *      (3)如果第一個是“)}]”中的符號,就直接返回false
         *      (4)如果遇到“({[”就繼續
         *      (5)如果匹配上了,就將這兩個符號全部出棧
         */
        char[] s1 = s.toCharArray();
        ArrayList fhList = new ArrayList<String>();
        //利用arraylist儲存所有符號
        for(int i = 0; i < s1.length; i++){
            String k = s1[i]+"";
            if("[".equals(k) || "]".equals(k) ||
               "(".equals(k) || ")".equals(k) ||
               "{".equals(k) || "}".equals(k)){
                fhList.add(k);
            }
        }
        //符號個數必須是偶數個
        int fhlegth = fhList.size();
        if(fhlegth % 2 == 1){
            return false;
        }

        for(int i = 0; i < fhList.size(); i++){
            //獲取當前位置符號
            String last = (String) fhList.get(i);
            //需要出棧的符號
            String pop = "";
            //遇到反方向的符號,切不是第一個時,就暫存上一個字元,用於和當前字元比較
            if(")}]".contains(last) && i-1 >= 0){
                pop = (String) fhList.get(i-1);
            }else if(")}]".contains(last)){
                return false;
            }
            //開始匹配,如果匹配上就“出棧”,並且長度漸少
            if(")".equals(last)){
                if(!"(".equals(pop) ){
                    return false;
                }
                fhList.remove(i);
                fhList.remove(i-1);
                i = i - 2;
            }else if("]".equals(last) ){
                if(!"[".equals(pop)){
                    return false;
                }
                fhList.remove(i);
                fhList.remove(i-1);
                i = i - 2;
            }else if("}".equals(last)){
                if(!"{".equals(pop)){
                    return false;
                }
                fhList.remove(i);
                fhList.remove(i-1);
                i = i - 2;
            }
        }
        //沒有全部出棧,即沒有全部匹配
        if(fhList.size() > 0){
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        String test = "[(){}]";
        Solution solution = new Solution();
        System.out.println(solution.isValid(test));
    }
}

個人解法,不代表最優解,有想法可以一起交流!!!

相關文章