1. 程式人生 > 實用技巧 >LeetCode 1541. 平衡括號字串的最少插入次數 棧

LeetCode 1541. 平衡括號字串的最少插入次數 棧

地址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;
        int
ans = 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; } };