1. 程式人生 > 實用技巧 >01 對稱匹配問題(總元素必為偶數個)

01 對稱匹配問題(總元素必為偶數個)

不會題目的思路總結

01 對稱匹配問題(總元素必為偶數個)

思想:

  1. 當讀取遇到左邊部分(對稱軸左邊),就把相應的右邊部分內容壓棧進去,
  2. 當讀取遇到右邊部分,則進行彈棧進行相等比較處理(與右邊部分內容)
  3. 當讀取完時所有元素時,棧中無元素時,則代表所求的東西是對稱的符合匹配規律的,
  4. 若中途棧為空或者彈棧比較的結果為false,那麼東西必然是不符合對稱的

注意:以"[]"(對稱圖形),則左邊部分內容(對稱軸左邊)為"[",右邊部分內容(對稱軸右邊)為"]"

例項:b站基礎面試題-----括號匹配問題(對稱的)

public class Solution01 {
    public static void main(String[] args) {
        Scanner  scanner=new Scanner(System.in);
        System.out.println("請輸入要判斷的字串");
        System.out.println(isPairs(scanner.next()));
    }    //利用棧先進後出的原理,括號匹配也是後面進去的先匹配)
    public static boolean isPairs(String string) {
        if (string.length() % 2 != 0) {
            //奇數必然不匹配
            return false;
        }
        //利用棧先進後出的原理,每遇到左括號,就壓進去(push)對應的右括號,然後遇到右括號就進行彈棧
        //                    若所有的彈棧都和對應的右括號的一致,就返回true,否則返回false
        Stack<Character> stack = new Stack();//定義一個棧,利用泛型限定壓棧的內容
        char[] chars = string.toCharArray();//為壓棧做準備
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '{') {
                stack.push('}');
            } else if (chars[i] == '[') {
                stack.push(']');
            } else if (chars[i] == '(')
                stack.push(')');
            else if (stack.isEmpty() || chars[i] != stack.pop()) {
                //棧空該次代表著遇到的就是結束符號
                //如果彈出的棧與遇到的右括號不相等,也是返回false;
                return false;
            }
        }
        //如果遍歷完所有的字元數字元素,都未返回false,那麼棧必然為空
        return stack.isEmpty();
    }