[LeetCode] 1249. Minimum Remove to Make Valid Parentheses

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 1249. Minimum Remove to Make Valid Parentheses相关的知识,希望对你有一定的参考价值。

移除无效的括号。题意是给一个带有左括号和右括号的字符串,请你移除一些括号,使得剩下的部分成为一个有效的字符串。例子,

Example 1:

Input: s = "lee(t(c)o)de)"
Output: "lee(t(c)o)de"
Explanation: "lee(t(co)de)" , "lee(t(c)ode)" would also be accepted.

Example 2:

Input: s = "a)b(c)d"
Output: "ab(c)d"

Example 3:

Input: s = "))(("
Output: ""
Explanation: An empty string is also valid.

Example 4:

Input: s = "(a(b(c)d)"
Output: "a(b(c)d)"

思路是stack但是这个题跟20题valid parenthesis还不太一样,因为不光是判断,而是最后需要返回一个有效的结果。这个题我没有用到stack但是用到了stack的思想,用一个open变量判断到底是左括号多还是右括号多,如果open小于0(右括号多)就一定不要再放右括号了。第一次扫描input,从左往右;第二次从右往左,但是因为第一次扫描的时候只是控制不能让右括号多于左括号,所以在第二次从右往左扫描的时候需要判断如果左括号多了,就不要再加入结果集了。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public String minRemoveToMakeValid(String s) {
 3         StringBuilder sb = new StringBuilder();
 4         int open = 0;
 5         for (char c : s.toCharArray()) {
 6             if (c == ‘(‘) {
 7                 open++;
 8             } else if (c == ‘)‘) {
 9                 if (open == 0) {
10                     continue;
11                 }
12                 open--;
13             }
14             sb.append(c);
15         }
16 
17         StringBuilder res = new StringBuilder();
18         for (int i = sb.length() - 1; i >= 0; i--) {
19             if (sb.charAt(i) == ‘(‘ && open-- > 0) {
20                 continue;
21             }
22             res.append(sb.charAt(i));
23         }
24         return res.reverse().toString();
25     }
26 }

 

以上是关于[LeetCode] 1249. Minimum Remove to Make Valid Parentheses的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 1249. Minimum Remove to Make Valid Parentheses

1249. Minimum Remove to Make Valid Parentheses

LeetCode Minimum Height Trees

leetcode:Minimum Subarray

leetcode@ [310] Minimum Height Trees

LeetCode -- Minimum Path Sum