leetcode1249.移除無效的括號
阿新 • • 發佈:2021-01-25
技術標籤:演算法
一、前言
主要是因為這道題我沒看評論和題解,並且我覺得自己的解法挺有趣,java程式碼的時間上擊敗100%,所以想記錄一下。
ps:對於用單調棧解的那些題目也很有趣,不過筆記記在本地上了。
二、題目
網址:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses/
三、解題思路
注意:
- 在這一道題中,用於模擬棧和接收字元的陣列都是同一個。
- 棧底是陣列中索引為 s.length()-1 的位置。接收字元則從字元陣列索引為0的位置開始接收。
- 對於這一個字元陣列,前面部分充當接收字元的字元陣列,後面部分充當棧,它們不會互相覆蓋,因為是先出棧,再接收。
步驟:
- 用一個變數記錄r右括號數量。
- 首先逆序遍歷s:
- 遇到左括號,如果r為0,則不入棧,否則入棧並且r-1;
- 遇到右括號直接入棧,r+1;
- 其它字元直接入棧。
- 結束遍歷s後,開始出棧,當棧頂非空的時候:
- 如果r大於0且當前出棧的元素為右括號,則拋棄這一出棧的元素,並且r-1;
- 否則接收這一字元。
- 返回這一字串。
四、程式碼
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);
}