678. Valid Parenthesis String
題目網址:https://leetcode.cn/problems/valid-parenthesis-string/
題意:給一只包含三種 char
(、)和*的 strings, 判斷s是否為有效的 string。有效的 string 具有如下規則:
- 任何左括號
(必須有相應的右括號)- 任何右括號
)必須有相應的左括號(- 左括號
(必須在對應的右括號之前)*可以被視為單個右括號)or 單個左括號(or 一個 empty string""empty string
""也被視為有效的 string。

Solution:
想法:利用 Greedy, 由於
*有三種可能, 因此我們需要用leftMin、leftMax來記錄未匹配左括號的範圍
leftMax代表未匹配左括號的最大數量, 也就是將所有*都變成(leftMin代表未匹配左括號的最小數量, 也就是將所有*都變成)一旦
leftMax < 0, 代表s中)太多, 將所有*都變成(也無法匹配, 直接返回false一旦
leftMin < 0, 此時的leftMin為-1, 代表不應把所有*都設為)➔ 而是應該把其中一個
*設為"", 以確保leftMin == 0
- 將其中一個
從)改為"", 也就是讓leftMin + 1e.g.
s = (*)
leftMin = -1, 因為(*)➔()), 但其實可以將*從)改為"", 使得(*)變成()leftMin = 1, 因為(*)➔(()遍歷結束時, 所有的左括號都應和右括號匹配。因此只有當
leftMin == 0時,s才是有效的
class Solution { |
- time:$O(n)$ ➔ 遍歷
s, 其中n為s的長度 - space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論