LeetCode - 20 括號匹配

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


左括號必須用相同類型的右括號閉合。

  • 左括號必須以正確的順序閉合。
  • 注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true

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

示例 3:
輸入: "(]"
輸出: false

示例 4:
輸入: "([)]"
輸出: false

示例 5:
輸入: "{[]}"
輸出: true

代碼

import java.util.Stack;

/**
 * @Author: zhuda
 * @Description:
 * @Date: Create in 9:37 2019/3/31
 */
public class Question20 {

    public static void main(String[] args) {
        System.out.println(isValid("(])"));
    }

    public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] temp = s.toCharArray();

        if (temp.length == 0) {
            return true;
        }

        for (int i = 0; i < temp.length; i++) {

            if (stack.empty()) {
                if (temp[i] == ')' || temp[i] == ']' || temp[i] == '}') {
                    return false;
                }
            }

            if (temp[i] == '(' || temp[i] == '[' || temp[i] == '{'){
                stack.push(temp[i]);
            }
            if (temp[i] == ')') {
                if (stack.peek() == '(') {
                    stack.pop();
                } else {
                    return false;
                }
            }
            if (temp[i] == ']') {
                if (stack.peek() == '[') {
                    stack.pop();
                } else {
                    return false;
                }
            }
            if (temp[i] == '}') {
                if (stack.peek() == '{') {
                    stack.pop();
                } else {
                    return false;
                }

            }
        }
        return stack.empty();
    }
}

思路

  • 使用棧作爲數據結構
  • 先用數組存儲輸入串
  • 當遇到左括號(包括 ,“(”,“[”,“{”)時直接入棧
  • 當棧空且等待入棧元素爲右括號時,直接返回 false
  • 當遇到右括號(包括 ,“)”,“]”,“}”)時,檢驗是否與棧頂元素匹配,若匹配則棧頂元素出棧,不匹配的則直接返回 false
  • 當輸入串掃描完畢之後,若棧不爲空則說明沒有匹配完全,輸入串非法返回 false

注意

  • 空串爲非法串
  • 注意判斷剛開始入棧就爲右括號的情況
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章