LeetCode 1541. 平衡括號字串的最少插入次數 棧
阿新 • • 發佈:2020-08-09
地址https://leetcode-cn.com/problems/minimum-insertions-to-balance-a-parentheses-string/
給你一個括號字串s,它只包含字元'(' 和')'。一個括號字串被稱為平衡的當它滿足: 任何左括號'('必須對應兩個連續的右括號'))'。 左括號'('必須在對應的連續兩個右括號'))'之前。 比方說"())","())(())))" 和"(())())))"都是平衡的,")()","()))" 和"(()))"都是不平衡的。 你可以在任意位置插入字元 '(' 和 ')' 使字串平衡。 請你返回讓 s平衡的最少插入次數。 示例1: 輸入:s = "(()))" 輸出:1 解釋:第二個左括號有與之匹配的兩個右括號,但是第一個左括號只有一個右括號。我們需要在字串結尾額外增加一個 ')' 使字串變成平衡字串 "(())))" 。 示例 2: 輸入:s = "())" 輸出:0 解釋:字串已經平衡了。 示例 3: 輸入:s = "))())(" 輸出:3 解釋:新增 '(' 去匹配最開頭的 '))' ,然後新增 '))' 去匹配最後一個 '(' 。 示例 4: 輸入:s = "((((((" 輸出:12 解釋:新增 12 個 ')' 得到平衡字串。 示例 5: 輸入:s = ")))))))" 輸出:5 解釋:在字串開頭新增4 個 '(' 並在結尾新增 1 個 ')' ,字串變成平衡字串 "(((())))))))" 。 提示: 1 <= s.length <= 10^5 s只包含'(' 和')'。
演算法1
括號的題目 還是包含棧這個元素
稍微不同的是 需要考慮 填補’(‘ 填補’)’ 和 填補’))’三種情況
C++ 程式碼
class Solution { public: int minInsertions(string s) { stack<char> sta; intans = 0; for(int i = 0;i < s.size();){ if(s[i] == '(') { sta.push('('); i++; continue; } if(s[i] == ')'){ if(sta.empty()){ //之前已經沒有了 ( 需要新增 ans++; }else{ sta.pop(); } if( i+1 == s.size() || s[i+1] != ')' ){ //缺少一個) 需要新增 ans++; i++; }else{ //移出兩個) i += 2; } } } ans += 2*sta.size(); return ans; } };