• SomeBottle

    力扣 LeetCode

    图片

    921. 使括号有效的最少添加 - 力扣(LeetCode)

    921. 使括号有效的最少添加 - 只有满足下面几点之一,括号字符串才是有效的:

    • 它是一个空字符串,或者
    • 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
    • 它可以被写作 (A),其中 A 是有效字符串。

    给定一个括号字符串 s ,在每一次操作中,你都可以在字符串的任何位置插入一个括号

    * 例如,如果 s = "()))" ,你可以插入一个开始括号为 "(()))" 或结束括号为 "())))" 。

    返回 为使结果字符串 s...


    思路

    因为括号可以在任何地方插入,我们在意的主要就是左括号和右括号分别多出了多少。因此对左括号先进行计数,右括号出现时先抵消左括号,如果左括号抵消完了说明右括号有多的,反之则左括号有多的;如果二者皆为 0 则不需要补充。


    代码```
    class Solution {
    public:
    int minAddToMakeValid(string s) {
    // 注意括号可以在任何位置插入
    // 主要就看有多少左括号和右括号没有被抵消
    int left = 0, right = 0;
    for (char c : s) {
    if (c == '(') {
    left++;
    } else {
    if (left > 0) {
    // 还有左括号就抵消
    left--;
    } else {
    // 没有左括号了,右括号多了
    right++;
    }
    }
    }
    return left + right;
    }
    };

    主楼
  • 咪帕

    同上,最优的贪心解法:时间 O(n),空间 O(1)```
    class Solution {
    public:
    int minAddToMakeValid(string s) {
    int ans = 0;
    int balance = 0;
    for (char c: s) {
    if (c == '(') {
    balance++;
    } else {
    if (balance == 0) {
    ans++;
    } else {
    balance--;
    }
    }
    }
    return ans + balance;
    }
    };

    #1

发表回复

登录后回复