LeetCode刷題系列——最長有效括號

前言

最近被新型冠狀病毒搞得人心惶惶,大家都不太敢出門,我也不敢出門(哈哈哈),索性就在家裏刷了一道leetcode的簡單題——有效的括號(leetcode20題),說簡單也不簡單,說難也不難,刷完之後覺得意猶未盡。然後再刷了一道leetcode的困難題——最長有效括號(leetcode32題)。今天就來講一下這兩道相似題目的題解。

第一題(leetcode20_有效的括號)

在這裏插入圖片描述

思路

先列出括號的類型把他存在HashMap中,然後利用棧先進後出的特性來解決。如果是左括號就直接進棧,如果是右括號就出棧,然後判斷出棧的左括號是否對應着對應的右括號即可。

代碼

package leetcode;

import java.util.HashMap;
import java.util.Stack;

/**
 * @author god-jiang
 * @date 2020/1/30  11:01
 */
public class StackIsValid {

    public static boolean isValid(String s) {
        //把括號的類型存進HashMap中
        HashMap<Character,Character> map=new HashMap<>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            //如果是左括號,直接進棧
            if (!map.containsKey(s.charAt(i))) {
                stack.push(s.charAt(i));
            } else {
                //如果是右括號,出棧然後判斷出棧左括號對應HashMap的左括號是否一致
                char top = stack.isEmpty() ? '#' : stack.pop();
                if (top != map.get(s.charAt(i))) {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

複雜度分析

  • 時間複雜度:O(N)。因爲整個過程遍歷一遍就可以處理完
  • 空間複雜度:O(N)。藉助了大小爲N的棧來輔助完成

第二題(leetcode32_最長有效括號)

在這裏插入圖片描述

思路

對於每個’(’,我們將它的下標進棧。對於每個’)’,我們彈出棧頂的元素並將當前元素的下標於當前棧頂下標作差,得出當前有效括號的長度。

代碼

package leetcode;

import java.util.Stack;

/**
 * @author god-jiang
 * @date 2020/1/30  11:59
 */
public class LongestValidParentheses {
    public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack<>();
        stack.push(-1);
        int max = 0;
        for (int i = 0; i < s.length(); i++) {
            //如果匹配到左括號就直接進棧
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else {
                // 右括號出棧,並且判斷棧是否爲空,
                // 如果爲空,把當前下標進棧,
                // 如果不爲空,計算出當前有效的長度,記錄下來
                stack.pop();
                if (stack.isEmpty()) {
                    stack.push(i);
                } else {
                    max = Math.max(max, i - stack.peek());
                }
            }
        }
        return max;
    }
}

複雜度分析

  • 時間複雜度:O(N)。因爲遍歷一次就能得出最長的有效括號
  • 空間複雜度:O(N)。因爲藉助了大小爲N的輔助棧處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章