1. 程式人生 > 其它 >leetcode1249.移除無效的括號

leetcode1249.移除無效的括號

技術標籤:演算法

一、前言

主要是因為這道題我沒看評論和題解,並且我覺得自己的解法挺有趣,java程式碼的時間上擊敗100%,所以想記錄一下。

在這裡插入圖片描述

ps:對於用單調棧解的那些題目也很有趣,不過筆記記在本地上了。



二、題目

網址:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses/



三、解題思路

注意:

  • 在這一道題中,用於模擬棧和接收字元的陣列都是同一個。
  • 棧底是陣列中索引為 s.length()-1 的位置。接收字元則從字元陣列索引為0的位置開始接收。
  • 對於這一個字元陣列,前面部分充當接收字元的字元陣列,後面部分充當棧,它們不會互相覆蓋,因為是先出棧,再接收。

步驟:

  1. 用一個變數記錄r右括號數量。
  2. 首先逆序遍歷s:
    1. 遇到左括號,如果r為0,則不入棧,否則入棧並且r-1;
    2. 遇到右括號直接入棧,r+1;
    3. 其它字元直接入棧。
  3. 結束遍歷s後,開始出棧,當棧頂非空的時候:
    1. 如果r大於0且當前出棧的元素為右括號,則拋棄這一出棧的元素,並且r-1;
    2. 否則接收這一字元。
  4. 返回這一字串。



四、程式碼

java程式碼:

    public String minRemoveToMakeValid(String s) {

        // 先是從右邊開始入棧
        // 右括號數量
        int rightBracketsCount = 0;
        // 模擬棧
int top = s.length(); char[] stack = new char[s.length()]; // 遍歷 char ch; int index = top; while (index > 0) { ch = s.charAt(--index); if (ch == '(') { if (rightBracketsCount == 0) { // 如果匹配完就不入棧了
continue; } // 如果右邊有'('沒匹配完 rightBracketsCount--; } else if (ch == ')') { rightBracketsCount++; } // 入棧 stack[--top] = ch; } // 此時還有右括號沒有匹配完, 那麼就從棧頂top開始匹配 while (top < s.length()) { ch = stack[top++]; if (rightBracketsCount > 0 && ch == ')') { rightBracketsCount--; continue; } stack[index++] = ch; } return new String(stack, 0, index); }