1. 程式人生 > >leetcode 921. 使括號有效的最少新增(機智題)

leetcode 921. 使括號有效的最少新增(機智題)

題意:

給一串括號組成的序列,問最少需要新增多少個才使得括號合法。

從形式上講,只有滿足下面幾點之一,括號字串才是合法的:

  • 它是一個空字串,或者
  • 它可以被寫成 AB (A 與 B 連線), 其中 A 和 B 都是有效字串,或者
  • 它可以被寫作 (A),其中 A 是有效字串

思路:

一開始蒙著眼睛寫DP,結果超時了。。。。。原來是個機智題。如果前面有"(",那麼後面來“)”就能保證是合法的。所以我們只需要統計最前面多的")"和最後面多的“(”。即第一個'('之後的‘(’應該要和')'相同數量,如果這個後面的括號和反括號的數量不匹配的話,需要額外新增括號與之匹配這是第一個需要補括號的地方,同時,第一個'('之前的‘)’需要額外新增括號成對,這是第二個需要補括號的地方。這兩個地方需要補括號的數量之和就是答案。

程式碼:

class Solution {
public:
int minAddToMakeValid(string S) {
    int len = S.length();
    int first = 0,last = 0; //first記錄反括號數量,last記錄括號數量
    for(int i=0;i<len;i++){
        if(S[i]=='(')last++;
        else {
            if(last==0)first++;
            else last--;
        }
    }
    return first+last;
}
};