【LeetCode刷题】NO.32---第1541题

103 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

1541. 平衡括号字符串的最少插入次数 给你一个括号字符串 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 只包含 '(' 和 ')' 。

二、思路分析:

这道题是一个难度为中等的题目,题目的思路基本上与上一篇所写的题目的思路是一致的,对于上一篇左括号对应右括号只要一个即可完成匹配,而这道题的要求是左括号出现一次,那么右括号就需要出现连续的两次才能够达到括号平衡。

所以这道题我们使用类似于栈的思路但不是用栈结构来进行求解,每次当左括号出现的时候,rneed就需要计数两次,当右括号出现的时候我们就要判断它的下一位字符是不是右括号,如果是就让rneed计数减2,如果不是结果计数加一即可。

三、代码:

/**
 * @param {string} s
 * @return {number}
 */
var minInsertions = function (s) {
  let rneed = 0
  let res = 0
  for (let i = 0; i < s.length; i++) {
    //如果使左括号那么rneed+
    if (s[i] == '(') rneed += 2
    // 如果是右括号那么需要查看它后一位的是不是右括号否则res+1
    if (s[i] == ')') {
      if (s[i + 1] == ')') {
        i += 1
        rneed -= 2
      } else {
        //不是连续的右括号
        res++
        rneed -= 2
      }
      if (rneed == -2) {
        res++
        rneed = 0
      }
    }
  }
  return rneed + res
};

四、总结:

这道题的思路与上一篇的思路几乎没有什么两样,我们只需要处理不同情况下的细节即可。但是这道题需要注意rneed的计数情况特别是在遇到右括号的时候。