算法筆試: 有效的括號

這是一道不久前的面試題目,下面的一些題目的描述:題目來源:某大廠公司筆試、面試中

題目描述

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

有效字符串需滿足:

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

示例 1:

輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true

解題思路:
算法原理

棧先入後出特點恰好與本題括號排序特點一致,即若遇到左括號入棧,遇到右括號時將對應棧頂左括號出棧,則遍歷完所有括號後 stack 仍然爲空;
建立哈希表 dic 構建左右括號對應關係:keykey 左括號,valuevalue 右括號;這樣查詢 22 個括號是否對應只需 O(1)O(1) 時間複雜度;建立棧 stack,遍歷字符串 s 並按照算法流程一一判斷。
算法流程

如果 c 是左括號,則入棧 pushpush;
否則通過哈希表判斷括號對應關係,若 stack 棧頂出棧括號 stack.pop() 與當前遍歷括號 c 不對應,則提前返回 falsefalse。
提前返回 falsefalse

提前返回優點: 在迭代過程中,提前發現不符合的括號並且返回,提升算法效率。
解決邊界問題:
棧 stack 爲空: 此時 stack.pop() 操作會報錯;因此,我們採用一個取巧方法,給 stack 賦初值 ?? ,並在哈希表 dic 中建立 key: ‘?’,value:’?'key:

?

,value:

?

的對應關係予以配合。此時當 stack 爲空且 c 爲右括號時,可以正常提前返回 falsefalse;
字符串 s 以左括號結尾: 此情況下可以正常遍歷完整個 s,但 stack 中遺留未出棧的左括號;因此,最後需返回 len(stack) == 1,以判斷是否是有效的括號組合。
複雜度分析

時間複雜度 O(N)O(N):正確的括號組合需要遍歷 11 遍 s;
空間複雜度 O(N)O(N):哈希表和棧使用線性的空間大小。

程序源碼解釋:



import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;

public class Test2 {
    public static void main(String [] args ) {
      //Scanner scan = new Scanner(System.in);
     //String s = scan.next();
      String s= "()'";
      isValid(s);
      System.out.println("這個字符是的結果爲"+isValid(s));
    }

  

        private static final Map<Character, Character> map = new HashMap<Character, Character>() {{

            put('{', '}');
            put('[', ']');
            put('(', ')');
            put('\n', '\n');

        }};

        public static boolean isValid (String s){
            if (s.length() > 0 && !map.containsKey(s.charAt(0)))return false;
            LinkedList<Character> stack = new LinkedList<Character>() {{
            	c
                add('\n');
            }};
            for (Character c : s.toCharArray()) {
                if (map.containsKey(c)) stack.addLast(c);
                else if (map.get(stack.removeLast()) != c)return false;


            }
            return stack.size() == 1;

        }


}

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