★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9828360.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Given a string S of '(' and ')' parentheses, we add the minimum number of parentheses ( '(' or ')', and in any positions ) so that the resulting parentheses string is valid.

Formally, a parentheses string is valid if and only if:

  • It is the empty string, or
  • It can be written as AB (A concatenated with B), where A and B are valid strings, or
  • It can be written as (A), where A is a valid string.

Given a parentheses string, return the minimum number of parentheses we must add to make the resulting string valid.

Example 1:

Input: "())"
Output: 1

Example 2:

Input: "((("
Output: 3

Example 3:

Input: "()"
Output: 0

Example 4:

Input: "()))(("
Output: 4

Note:

  1. S.length <= 1000
  2. S only consists of '(' and ')' characters.

给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效。

从形式上讲,只有满足下面几点之一,括号字符串才是有效的:

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

给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。

示例 1:

输入:"())"
输出:1

示例 2:

输入:"((("
输出:3

示例 3:

输入:"()"
输出:0

示例 4:

输入:"()))(("
输出:4

提示:

  1. S.length <= 1000
  2. S 只包含 '(' 和 ')' 字符。

12ms:直觉与算法

跟踪字符串的平衡:'(''s的数量减去's的数量')'。如果字符串的平衡为0,则该字符串有效,并且每个前缀都具有非负平衡。

上述想法在匹配括号问题时很常见,但如果您之前没有看过,可能很难找到。

现在,考虑每个前缀的平衡S。如果它是负数(比如-1),我们必须添加一个'('括号。另外,如果平衡S是正数(比方说+B),我们必须B在末尾添加')'括号。

 1 class Solution {
 2     func minAddToMakeValid(_ S: String) -> Int {
 3         var ans:Int = 0 , bal:Int = 0
 4         for index in S.indices
 5         {
 6             bal += S[index] == "(" ? 1 : -1
 7             if bal == -1
 8             {
 9                 ans += 1
10                 bal += 1
11             }
12         }
13         return ans + bal
14     }
15 }


16ms

 1 class Solution {
 2     func minAddToMakeValid(_ S: String) -> Int {
 3         var incompleteSymbols: [Character] = []
 4
 5         S.forEach { character in
 6             if let lastIncomplete = incompleteSymbols.last {
 7                 if lastIncomplete == "(" && character == ")" {
 8                     incompleteSymbols.removeLast()
 9                 }
10                 else {
11                     incompleteSymbols.append(character)
12                 }
13             }
14             else {
15                 incompleteSymbols.append(character)
16             }
17         }
18
19         return incompleteSymbols.count
20     }
21 }


20ms

 1 class Solution {
 2     func minAddToMakeValid(_ S: String) -> Int {
 3         if(S == ""){
 4             return 0
 5         }
 6
 7         var arrS = Array(S).map{"\($0)"}
 8         var open = 0
 9         var unclosed = 0
10         for c in arrS {
11             if(c == "(") {
12                 open += 1
13             }
14             if(c == ")") {
15                 if( open > 0){
16                     open -= 1
17                 } else {
18                     unclosed += 1
19               }
20             }
21         }
22         var total = (open + unclosed)
23         return total
24     }
25 }


20ms

 1 class Solution {
 2     func minAddToMakeValid(_ S: String) -> Int {
 3         var arr = [Character]()
 4         S.forEach { (c) in
 5              if arr.count>0 &&  arr[arr.count-1] == "(" && c == ")" {
 6                 arr.removeLast()
 7             } else { arr.append(c) }
 8         }
 9         return arr.count
10     }
11 }


64ms

 1 class Solution {
 2     func minAddToMakeValid(_ S: String) -> Int {
 3         var stack = [String]()
 4
 5         for i in 0..<S.count {
 6             if S[i] == "(" {
 7                 stack.append(S[i])
 8             } else if S[i] == ")" && stack.last == "(" {
 9                 stack.removeLast()
10             } else {
11                 stack.append(S[i])
12             }
13         }
14
15         return stack.count
16     }
17 }
18
19 extension String {
20     subscript(i:Int) -> String {
21         let charIndex = self.index(self.startIndex, offsetBy: i)
22         return String(self[charIndex])
23     }
24 }

转载于:https://www.cnblogs.com/strengthen/p/9828360.html

[Swift]LeetCode921.使括号有效的最少添加 | Minimum Add to Make Parentheses Valid相关推荐

  1. 使括号有效的最少添加

    使括号有效的最少添加 给定一个由(和)括号组成的字符串S,我们需要添加最少的括号(或是),可以在任何位置,以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字符串才是有效的: 它是一个 ...

  2. LeetCode 921. 使括号有效的最少添加(栈)

    1. 题目 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字 ...

  3. [LeedCode]921. 使括号有效的最少添加

    题目描述: 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效.从形式上讲,只有满足下面几点之一,括号字符 ...

  4. LeetCode 1674. 使数组互补的最少操作次数(差分思想)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...

  5. LeetCode 1653. 使字符串平衡的最少删除次数(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,它仅包含字符 'a' 和 'b'​​​​ . 你可以删除 s 中任意数目的字符,使得 s 平衡 . 我们称 s 平衡的 当不存在下标 ...

  6. LeetCode 1568. 使陆地分离的最少天数(DFS)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid ,其中 0 表示水,而 1 表示陆地. 岛屿由水平方向或竖直方向上相邻的 1 (陆地)连接形成. 如 ...

  7. amazon alexa_亚马逊使向自定义Alexa Skills添加声音变得更加容易

    amazon alexa by Terren Peterson 由Terren Peterson 亚马逊使向自定义Alexa Skills添加声音变得更加容易 (Amazon has made it ...

  8. leetcode1568. 使陆地分离的最少天数(Python3、c++)

    文章目录 leetcode1568. 使陆地分离的最少天数 方法:并查集 思路: 并查集: 求割点: 代码: Python3: cpp: 结果: leetcode1568. 使陆地分离的最少天数 给你 ...

  9. 周末加餐 使陆地分离的最少天数

    给你一个由若干 0 和 1 组成的二维网格 grid ,其中 0 表示水,而 1 表示陆地.岛屿由水平方向或竖直方向上相邻的 1(陆地)连接形成. 如果恰好只有一座岛屿 ,则认为陆地是连通的 :否则, ...

最新文章

  1. 图解HTTP学习记录(一)
  2. OpenCV清除背景扣除background subtraction的实例(附完整代码)
  3. Mysql Workbench导出数据库时报 Unknown table ‘column_statistics‘ in information_schema (1109)
  4. aix内核是linux,查看Linux及AIX硬件信息方法总结
  5. Spring 容器简介
  6. 如何在定制化组件中实现并使用v-model
  7. python与办公自动化-python办公自动化:自动进行word文档处理和排版
  8. 服务器维修工程师个人简历,机械维修工程师个人简历模板精选
  9. 简道云、氚云、明道云们更讨中小企业欢心?
  10. R如何读取csv文件
  11. 阿里云天池机器学习训练营(Day7, Day8):机器学习算法(三):K近邻(k-nearest neighbors)初探
  12. rebase操作步骤
  13. 【提升coding能力】100道Python练习题11-20
  14. Python微信公众号教程基础篇——收发文本消息
  15. Chrome如何使用
  16. 解决麒麟V10上传文件乱码问题
  17. 12年时记录的一堆杂事
  18. androidstudio MultiDex慎用
  19. PAData:FCoin潜在受害者或超2000人,人均损失或超25 BTC
  20. 正则表达式: 以英文字母开头,只能包含英文字母、数字、下划线

热门文章

  1. android客户端中间人攻击,Android 中间人攻击
  2. php索引数组转键数组,PHP-Codeigniter:如何从指定索引转换数组值?
  3. cc2530定时器和捕获比较_STM32定时器PWM和输入捕获事件
  4. 计算几何-判断两条线段是否相交
  5. 计算机网络—CSMA/CA协议
  6. JAVA集合一:ArrayList和LinkedList
  7. n皇后---一维数组解法
  8. CTF之Web训练后篇2
  9. bzoj 3412: [Usaco2009 Dec]Music Notes乐谱
  10. (经典实用五大排序)选择排序,计数排序,冒泡排序,快速排序,插入排序